考虑以下示例脚本:
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。
这不是关于 PyCharm 的错误,因为我也无法使用 IDEA 重现它。IDEA 使用与 PyCharm 相同的核心。
这是因为您启动脚本的方式。如果您使用 启动脚本Run
,它可以工作。如果你用 启动它Debug
,它不会。
因为Run
只需在终端中运行脚本,但Debug
会启动一个调试器并将该进程连接到该调试器。您看到的输出实际上来自调试器,而不是直接来自您的脚本。当您替换您的进程时,调试器不会重建与该新创建进程的连接。
这就是你没有被2
输出的原因。
在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 标志。