3

考虑以下示例脚本:

import os
import sys

print(1)
os.execl(sys.executable, sys.executable, '-c', 'print(2)')
print(3)

结果是

1

我期待

1
2

我认为是因为替换过程没有使用相同的stdin/stdout/stderr?

如何在使用时达到我的预期execl

我在 Windows 上使用 Python 3.6。

4

2 回答 2

2

这不是关于 PyCharm 的错误,因为我也无法使用 IDEA 重现它。IDEA 使用与 PyCharm 相同的核心。

这是因为您启动脚本的方式。如果您使用 启动脚本Run,它可以工作。如果你用 启动它Debug,它不会。

因为Run只需在终端中运行脚本,但Debug会启动一个调试器并将该进程连接到该调试器。您看到的输出实际上来自调试器,而不是直接来自您的脚本。当您替换您的进程时,调试器不会重建与该新创建进程的连接。

这就是你没有被2输出的原因。

于 2017-12-19T09:39:18.973 回答
1

在Linux中,有一个标志FD_CLOEXEC,你可以通过fcntl.fcntl(sys.stdout,fcntl.F_GETFD)

您描述的行为可以在 ubuntu16 中通过

import os
import sys
import fcntl
print(1)
ret = fcntl.fcntl(sys.stdout, fcntl.F_GETFD)
ret |= fcntl.FD_CLOEXEC
fcntl.fcntl(sys.stdout, fcntl.F_SETFD, ret)
os.execl(sys.executable, sys.executable, '-c', 'print(2)')
print(3)

因此,当您在 PyCharm 中运行时,它必须重定向标准输出并设置等效的 windows 标志。

于 2017-12-19T12:39:13.007 回答