有没有办法在POPEN做在同一个“会话”多个呼叫?例如,我可以使通过它和一个呼叫,则另一个之后,而不必命令连接成一个长字符串?

有帮助吗?

解决方案

您不是在“拨打电话”当您使用POPEN,你正在运行的可执行文件和标准输入,标准输出,和stderr对它讲话。如果可执行文件有做工作的“会话”(例如,从标准输入读取行),那么一些方式,是的,你可以做到这一点。否则,你需要给exec多次。

subprocess.Popen是(大部分)只是围绕execvp的包装(3)

其他提示

假设你希望能够运行一个外壳,并将其发送多个命令(和读取它们的输出),看来你可以做这样的事情:

from subprocess import *
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)

在其中,e.g。,:

>>> p.stdin.write("cat /etc/motd\n")
>>> p.stdout.readline()
'Welcome to dev-linux.mongo.com.\n'

(当然,你应该检查stderr过,否则请Popenstdout合并的话)。一个主要的问题与上面的是,stdinstdout管道的阻塞模式,所以很容易得到“卡住”永远等待从外壳输出。虽然我还没有尝试过,有href="http://code.activestate.com/recipes/440554/" rel="nofollow noreferrer">食谱的解决这个问题。

更新:在看相关的问题/回答后,它看起来可能比较简单,只需使用Python的内置select模块,看看是否有数据就stdout阅读(你也应该做同样stderr,当然),例如:

>>> select.select([p.stdout], [], [], 0)
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], [])
  

例如,可以使我通过它,一个呼叫,则另一个之后,而不必命令连接成一个长字符串?

听起来你使用shell =真。不这样做,除非你需要。代替使用壳=假(默认值),并通过在命令/ ARG列表。

  

有没有办法在POPEN做在同一个“会话”多个呼叫?例如,我可以使通过它和一个呼叫,则另一个之后,而不必命令连接成一个长字符串?

任何原因,你不能只创建两个POPEN情况下,等待/每个必要的沟通?这是做正常的方式,如果我理解正确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top