如何通过subprocess.Popen Python

时间:2017-05-10 04:33:13

标签: python linux subprocess

code-1:将linux命令作为参数序列传递

from subprocess import Popen, PIPE

run_cmd = Popen(['ls','-l','mkdir','hello'], stdout = PIPE, stderr = PIPE)
output,error = run_cmd.communicate()
print error,output, run_cmd.returncode

输出 - 1:

ls: cannot access mkdir: No such file or directory
ls: cannot access hello: No such file or directory
 2

在上面的代码中,我试图通过将它们作为一系列参数传递来运行多个linux命令。如果我将上面的代码修改为以下代码,它可以正常工作。

code-2:将linux命令作为字符串传递

from subprocess import Popen, PIPE

run_cmd = Popen('mkdir hello; ls -l; echo Hello; rm -r hello', shell=True, stdout = PIPE, stderr = PIPE)
output,error = run_cmd.communicate()
print error,output, run_cmd.returncode

输出 - 2:

drwxrwxr-x. 2 sujatap sujatap    6 May  9 21:28 hello
-rw-rw-r--. 1 sujatap sujatap   53 May  8 20:51 test.py
Hello
0

由于shell=True不是建议的使用方式,因此我想使用前者运行linux命令。感谢。

1 个答案:

答案 0 :(得分:3)

如果某些内容无效,请查看其文档:https://docs.python.org/2/library/subprocess.html#popen-constructor

  

args应该是一系列程序参数,否则就是一个字符串。默认情况下,如果args是一个序列,执行的程序是args中的第一项。如果args是一个字符串,则解释与平台有关,如下所述。有关与默认行为的其他差异,请参阅shell和可执行参数。除非另有说明,否则建议将args作为序列传递。

所以测试你的单个程序首先运行(程序列表及其参数),然后列出一个列表并按顺序运行它们:

myprogramsequence = [
    ["ls", "-l"],
    ["mkdir", "hello"]
]

for argumentlist in myprogramsequence:
    run_cmd = Popen( argumentlist, ...