【问题标题】:Python error when executing shell script执行 shell 脚本时出现 Python 错误
【发布时间】:2015-05-05 16:39:31
【问题描述】:

我正在使用 python 执行一行 shell 脚本。它不适用于 which 来测试自制软件的存在

#!/usr/bin/python
import sys, subprocess
subprocess.call(["which python"])

抛出长错误

Traceback (most recent call last):
  File "installations.py", line 5, in <module>
    subprocess.call(["which python"]) 
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

但我知道 shell 执行在某种程度上可以正常工作

#!/usr/bin/python
import sys, subprocess
subprocess.call(["whoami]) 

打印我的用户名就好了。我做错了什么,还是由于某种原因不受支持。是否有更好的支持方式来检测安装是否存在?

【问题讨论】:

    标签: python shell subprocess


    【解决方案1】:

    失败的调用试图找到一个名为“which python”的可执行文件,它没有按照您的预期运行which,参数为python。您传递给 call 的列表(除非设置了 shell=True)是命令和所有参数的列表。正在做

    subprocess.call(['which', 'python'])
    

    可能会给你你正在寻找的东西。

    【讨论】:

    • 完美。那么执行shell脚本字符串有更好的方法吗?类似于 PHP 的shell_exec()?非常感谢!
    • subprocess 模块通常是从 python 执行命令的“最佳”方式。如果您希望它在键入时看起来更像一个 shell 命令,并且可能更像 PHP 的 shell_exec,您可以将参数 shell=True 添加到您的 call() 函数中,然后第一个参数变成一个字符串在 shell 中执行,而不是作为 lilst 的可执行文件和参数列表,所以如果你愿意,你可以为这个例子做 subprocess.call( "which python", shell=True)——但是你必须处理更多的引号转义和类似的东西
    【解决方案2】:

    当以这种方式调用时,您需要将命令行中的每个单词分隔为可迭代对象的不同元素:

    subprocess.call(["which", "python"])
    

    强烈建议阅读docs 几遍,以便真正了解启动子流程的所有可能方式以及它们之间的区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多