【发布时间】: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
当我检查ninja 在bash 中的位置时,我开始觉得有些奇怪。
$ 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
-
which找不到ninja -
type ninja产生它位于/Users/niklas/Bin/ninja - 路径
/Users/niklas/Bin不在$PATH
我的设置出了什么问题?为什么bash居然能找到ninja,但是python只能在shell=True模式下,那为什么附加的参数不传呢?
【问题讨论】:
-
你的 .bashrc 或类似的禁令配置文件中可能有 hash -p ... ninja
标签: macos bash python-3.x osx-mavericks