无法使用subprocess.Popen捕获ls -la的结果

时间:2017-03-16 16:26:46

标签: python subprocess python-2.x

我在尝试使用Popen执行自定义命令时捕获输出:

import subprocess

def exec_command():
    command = "ls -la" # will be replaced by my custom command 
    result = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0]
    print(result)

exec_command()

我得到一个OSError跟随堆栈跟踪:

 File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

请告诉我需要使用的内容。

注意:stacktrace显示代码是在Python 2.7中执行的,但我在Python 2.6中运行时出现了相同的错误

1 个答案:

答案 0 :(得分:1)

在没有Invalidate的情况下运行(正确地执行; shell=True是危险的),您应该将命令作为命令和参数的序列传递,而不是单个字符串。固定代码是:

shell=True

如果某些参数涉及用户输入,则只需将其插入def exec_command(): command = ["ls", "-la"] # list of command and argument ... rest of code unchanged ...

list

注意:如果您的命令足够简单,我建议完全避免使用def exec_command(somedirfromuser): command = ["ls", "-la", somedirfromuser] subprocessos.listdir(或者在Python 3.5 +上,单独使用os.stat)可以以更加编程方式使用的形式获得与os.scandir相同的信息,而无需解析它,并且可能比启动外部流程并通过管道与其通信更快。