【发布时间】:2014-04-17 19:20:32
【问题描述】:
我正在尝试运行一个命令,获取它的输出,然后在同一环境中运行另一个命令(例如,如果我在第一个命令中设置了一个环境变量,我希望它可用于第二个命令)。我试过这个:
import subprocess
process = subprocess.Popen("/bin/bash", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE);
process.stdin.write("export MyVar=\"Test\"\n")
process.stdin.write("echo $MyVar\n")
process.stdin.flush()
stdout, stderr = process.communicate()
print "stdout: " + str(stdout)
# Do it again
process.stdin.write("echo $MyVar\n")
process.stdin.flush()
stdout, stderr = process.communicate()
print "stdout: " + str(stdout)
但是communicate() 一直读到最后,所以这不是一个有效的技术。 (我明白了:)
stdout: Test
Traceback (most recent call last):
File "./MultipleCommands.py", line 15, in <module>
process.stdin.write("echo $MyVar\n")
ValueError: I/O operation on closed file
我见过这个:https://stackoverflow.com/a/15654218/284529,但它没有给出如何做它建议的工作示例。谁能演示如何做到这一点? 我还看到了其他涉及在循环中不断检查输出的技术,但这不符合“获取命令的输出”的心态 - 它只是将其视为流。
【问题讨论】:
-
对于您正在谈论的具体示例,听起来您最好使用 Popen 采用的 env kwarg:
Popen("echo $MyVar"], env={"MyVar": "Test"})。 -
@dano 你是对的。在实际情况下,我可能想启动一个 ssh 会话,并保持打开状态并继续向其发出命令,以避免为每个命令建立新连接的开销。
-
在这种情况下,我建议使用 paramiko:github.com/paramiko/paramiko
-
您能否为我的个人调查回答一个问题:
subprocess文档中的哪个位置让您认为process.communicate()可能会在同一过程中被多次调用?对于交互使用,pexpect比subprocess更适合。如果你想通过 ssh 运行命令;考虑使用fabric作为库(它比paramiko更高级)。 -
没有什么让我明确地认为它没问题,它似乎是我在子进程中唯一能找到的“得到命令的输出”,而不是无限期地从管道中读取。我会研究一下“面料”,谢谢。
标签: python subprocess