【问题标题】:Strange behaviour of bash when finding executable查找可执行文件时 bash 的奇怪行为
【发布时间】:2015-09-29 10:42:22
【问题描述】:

我正在开发一个 Python 应用程序,它在内部必须调用 ninja 命令,但它找不到带有 subprocess 模块的可执行文件。当我传递shell=True 时,它确实找到了 可执行文件,但不向进程传递参数。使用os.system() 有效。

subprocess.call(['ninja'] + args)              # Can't find ninja
subprocess.call(['ninja'] + args, shell=True)  # Finds & runs ninja, but the additional arguments int "args" are not passed
os.system(' '.join(shlex.quote(x) for x in ['ninja'] + args))  # Works fine

当我检查ninjabash 中的位置时,我开始觉得有些奇怪。

$ which ninja
$ type ninja
ninja is hashed (/Users/niklas/Bin/ninja)
$ echo $PATH
~/Bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/3.4/bin/:/Users/niklas/Documents/apache-maven-3.3.3/bin:/Users/niklas/Documents/grib2json-0.8.0-SNAPSHOT/bin
  1. which 找不到 ninja
  2. type ninja 产生它位于 /Users/niklas/Bin/ninja
  3. 路径/Users/niklas/Bin不在$PATH

我的设置出了什么问题?为什么bash居然能找到ninja,但是python只能在shell=True模式下,那为什么附加的参数不传呢?

【问题讨论】:

  • 你的 .bashrc 或类似的禁令配置文件中可能有 hash -p ... ninja

标签: macos bash python-3.x osx-mavericks


【解决方案1】:

问题在于~ 是一个bashism,而python 调用os.execvp() 来执行subprocess.call(),这显然是使用execvp(),系统调用,确实如此不做波浪号扩展

您的 PATH 应为 /Users/niklas/Bin:...。当您设置PATH=~/Bin:$PATH 时,波浪号扩展通常由shell 完成。

所以 bash 可以找到它,因为它每次都重新进行波浪号扩展,但是 execvp() 永远找不到它。

正如@larsks 所说,shell=True 需要一个字符串。

【讨论】:

    【解决方案2】:

    如果您设置shell=True,那么您的命令必须是字符串而不是列表。考虑:

    >>> import subprocess
    >>> subprocess.call(['echo', 'hello'], shell=True)
    
    0
    >>> subprocess.call('echo hello', shell=True)
    hello
    0
    

    如果您传递带有shell=True 的列表,则仅考虑列表的第一项:

    >>> subprocess.call(['echo hello', 'hello'], shell=True)
    hello
    0
    >>> 
    

    路径 /Users/niklas/Bin 不在 $PATH 中

    是的。这是那里的第一项:

    $ echo $PATH
    ~/Bin:/usr/local/bin:...
    

    ...假设你是niklas

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多