我有一个功能,我需要在python脚本中运行命令。从另一个答案来看,我认为call from subprocess module
是最安全的方式。但是,我无法解决这个问题。我正在使用python 2.7
这是我正在尝试的小版本:
import subprocess
a = "echo hello"
subprocess.call([a])
它给了我以下错误:
subprocess.call([a])
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我无法弄明白为什么!
答案 0 :(得分:1)
您编写的代码存在问题,subprocess.call接受一个列表,其中列表的第一个元素是命令。在您的情况下,echo
和hello
是您的参数,它应该是列表中的下一个值。所以你的代码应该是这样的。
import subprocess
a = [ "echo","hello"]
subprocess.call(a)
答案 1 :(得分:1)
您可以将命令作为字符串或列表传递,但不能作为列表中的字符串传递,否则系统会尝试运行echo hello
过程(显然不存在,这解释了OSError: [Errno 2] No such file or directory
错误消息)。将其作为字符串传递在某些系统上需要shell=True
。
对于shell=True
命令(在某些系统上echo
中有非内置版本)的shell内置函数,还需要/bin
,只是为了增加混乱)
import subprocess
subprocess.call(["echo","hello"],shell=True)
对于非内置命令(我假设echo
只是这里的一个测试),请避免使用shell=True
,因为它会增加一个不必要的shell层,从而降低启动性能,并且容易出现代码注入(echo hello; rm -rf everything_on_disk)
例如,要运行您喜欢的编辑器,您可以执行以下操作:
subprocess.call(["emacs","readme.txt"])