【问题标题】:Running subprocess.call from python script从 python 脚本运行 subprocess.call
【发布时间】:2018-03-07 03:48:19
【问题描述】:

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

我不知道为什么!

【问题讨论】:

    标签: python-2.7 shell command subprocess external


    【解决方案1】:

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

    import subprocess
    
    a = [ "echo","hello"]
    subprocess.call(a)
    

    【讨论】:

      【解决方案2】:

      您可以将命令作为 stringlist 传递,但不能作为列表中的字符串传递,否则系统会尝试运行 echo hello 进程(这显然不存在,这解释了OSError: [Errno 2] No such file or directory 错误消息)。在某些系统上将其作为字符串传递需要shell=True

      shell=True 也需要使用 shell 内置命令,例如 echo 命令(在某些系统上 /bin 有非内置版本,只是为了增加混乱)

      import subprocess
      subprocess.call(["echo","hello"],shell=True)
      

      对于非内置命令(我假设echo 在这里只是一个测试),请避免使用shell=True,因为它添加了不必要的外壳层,会降低启动性能,并且容易发生代码注入(echo hello; rm -rf everything_on_disk)

      例如,要运行您喜欢的编辑器,您可以:

      subprocess.call(["emacs","readme.txt"])
      

      【讨论】:

      • 嗨,只是一个后续问题:我想将字符串 src 写入文件。那么,我应该这样做吗? inputFile = "nameInput" c1 = ["echo" ,src, ">>", inputFile] call(c1, shell=True)
      • 后续问题在这里并不是真正的主题,但请查看它完美回答的问题:stackoverflow.com/questions/4965159/…
      • 是的,只是想确定我的理解是否正确。谢谢:)
      • 用我的回答+网站上的所有信息(谷歌搜索,不要使用网站搜索,因为它很烂)你会找到一切。
      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多