【问题标题】:Calling another process from python/child process need to access shell从 python/子进程调用另一个进程需要访问 shell
【发布时间】:2011-02-10 15:03:32
【问题描述】:

我用Popen从python调用一个C/C++程序,python代码应该观察子进程的行为并为他自己的工作收集一些数据。

问题是 C 代码已经使用管道来调用一些 shell 命令 - 所以在我从 python 执行之后,C 程序无法执行 bash shell 命令。

有什么方法可以从Popen调用来指定,子进程应该在shell中执行他自己的管道命令???

我尝试使用 shell=True,但没有帮助!

【问题讨论】:

  • “观察”是什么意思?如果子进程正在使用其标准输出与另一个子进程对话,则它不能使用它与父进程对话。也许它使用标准错误。请提供更多信息。
  • 好的,child (c 代码) 已经开发完成,并且已经使用 stdout 与 superprocess (shell) 对话。现在python应该只调用child,收集他在stderr上写的东西,但是child仍然需要能够与现在的super-superprocess(shell)对话才能执行一些shell命令!
  • 我对你想要做什么只有一个模糊的概念。我怀疑当您说 C 程序正在将其标准输出发送到 shell 时,您的实际意思是它被打印到屏幕上。我还怀疑您正在与许多处理管道的 API 不允许您同时通过管道输入和输出同一程序 (popen) 的事实作斗争。我不知道 Python API 会是什么样子,但这是有原因的,并且有一些方法可以通过使用较低级别的函数在 C 中解决它。尝试在命令行中输入“man pipe”

标签: c++ python c unix subprocess


【解决方案1】:

根据您的描述,您似乎正在使用 Popen 执行命令行,其中 Popen 调用了一个 shell。

您应该让 Popen 直接调用您的程序,如下所示:

from subprocess import Popen,PIPE
p = Popen(['/my/fancy/program','-myarg1','-myarg2'],stdout=PIPE)
from_process = p.communicate()[1]

【讨论】:

    【解决方案2】:

    最好的方法可能是使用到 localhost 的 TCP 连接。如果您使用的是 *nix,您可能可以通过打开一个临时文件并从主机应用程序轮询它来做到这一点。

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2016-08-11
      • 2022-08-11
      • 1970-01-01
      相关资源
      最近更新 更多