subprocess.Popen中忽略参数

时间:2015-11-18 10:03:41

标签: python linux subprocess popen

我正在尝试从python脚本中运行shell命令。这是在CentOS Linux发行版中运行的。 Python版本是2.6.6。

文件系统如下:

bash-4.1$ ls
example.py  file1  file2  file3

脚本example.py如下:

#!/usr/bin/python
import os
import logging
import subprocess
import shlex

if __name__ == "__main__":
    path = os.getcwd()
    command = "touch file1 file2 file3"
    print("Running \"{0}\" at {1}".format(command, path))
    command_as_list = shlex.split(command)
    print("command_as_list = {0}".format(command_as_list))
    process = subprocess.Popen(command_as_list,
                          shell=True,
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE,
                          cwd=path)
    if process.wait() == -1:
        raise Exception("Error in command {0}".format(command))

    if process.stderr is not None:
        print("Error ouput: {0}".format(process.stderr.read()))

运行脚本会产生以下输出:

bash-4.1$ ./example.py
Running "touch file1 file2 file3" at /home/example
command_as_list = ['touch', 'file1', 'file2', 'file3']
Error ouput: touch: missing file operand
Try `touch --help' for more information

直接在命令行上运行命令按预期工作:

bash-4.1$ touch file1 file2 file3

看起来file1 file2 file3部分被忽略了。知道为什么吗?我错过了与使用subprocess.Open()相关的内容吗?

1 个答案:

答案 0 :(得分:2)

如果你将shell设置为True,则不必使用shlex - 只需将命令作为字符串传递即可。

另一种方法是删除shell=True

我希望它会有所帮助:)

UPD:justr试过 - 它应该解决这个问题。