【问题标题】:How to redirect stdin/stdout/stderr when replacing process using os.execl使用 os.execl 替换进程时如何重定向 stdin/stdout/stderr
【发布时间】:2018-05-30 18:29:32
【问题描述】:

考虑以下示例脚本:

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。

【问题讨论】:

  • 无法在 Windows 10 上使用 Python 3.6.2 重现。只需 2 出现在 cmd 提示符之后。
  • @SergeBallesta,谢谢!我在 PyCharm 中运行脚本,由于某种原因,它不打印 2。当我从命令提示符运行它时,它可以工作。愚蠢,我知道。 (^_^;)
  • 我在 YouTrack 上创建了一个错误报告:youtrack.jetbrains.com/issue/PY-27648(很遗憾,我无法在赏金期间删除此问题。)

标签: python pycharm os.execl


【解决方案1】:

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

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

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

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

【讨论】:

  • 你说的有道理,但我很肯定我使用的是Run,而不是Debug
  • 我在 ubuntu 16.04 上使用 pycharm 2017.3 再次对其进行了测试。它的行为就像我上面描述的那样。 Run 有效,但 Debug 无效。
  • 只是好奇,你也在使用 Python 3.6 吗?听说 PyCharm 使用了不同的debugging infrastructure for 3.6,也许测试运行器也被重写了?
【解决方案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 标志。

【讨论】:

  • op 在 windows 中使用 PyCharm,没有fcntl 接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多