我在尝试使用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中运行时出现了相同的错误
答案 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]
。 subprocess
和os.listdir
(或者在Python 3.5 +上,单独使用os.stat
)可以以更加编程方式使用的形式获得与os.scandir
相同的信息,而无需解析它,并且可能比启动外部流程并通过管道与其通信更快。