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命令。感谢。
答案 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, ...