从python脚本运行subprocess.call

时间:2017-09-26 04:05:55

标签: python-2.7 shell command subprocess external

我有一个功能,我需要在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

我无法弄明白为什么!

2 个答案:

答案 0 :(得分:1)

您编写的代码存在问题,subprocess.call接受一个列表,其中列表的第一个元素是命令。在您的情况下,echohello是您的参数,它应该是列表中的下一个值。所以你的代码应该是这样的。

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"])