为什么使用/usr/bin/env会破坏Python导入?

2024-04-30 03:10:14 发布

您现在位置:Python中文网/ 问答频道 /正文

OSX 10.8.2上的Python2.7.3

我正在编写一个导入降价模块的脚本。为了便于移植,我使用了#!/usr/bin/env pythonshebang。当我通过./myscript.py arg1直接在shell中运行脚本时,它运行得很好

当我从(登录)shell外部运行脚本时,例如通过AppleScriptdo shell script "/path/to/myscript.py " & quoted form of arg1,它将失败

myscript.py", line 8, in <module>
    import markdown
ImportError: No module named markdown

我想这可能是shebang的一个问题,所以我将shebang更改为python位置#!/usr/local/bin/python,脚本运行得很好。在

所以我的问题有两个:

  1. 为什么使用/usr/bin/env python会破坏我的导入?在
  2. 如何避免这个问题而不必使用/usr/local/bin/python?在

Tags: 模块pyenv脚本binusrlocalshell
2条回答

#!/usr/bin/env python的意思是“在$PATH上找到python,就像shell正在寻找它一样,然后运行它。”因此,由于得到的结果不同,可能使用的是不同的python。在

要进行检查,请查看运行/usr/local/bin/python/usr/bin/env python是否提供相同的python。您还可以使用type -a python来查找$PATH上的每一个python。在我的系统中,type -a python给出:

python is /opt/local/bin/python
python is /usr/bin/python
python is /usr/local/bin/python

(第一个由MacPorts安装。)

总之,正如rodrigo指出的,直接启动可能没有使用您期望的$PATH。这意味着使用/usr/bin/env是行不通的。在

嗯,看起来登录shell中的PATH环境变量与AppleScript进程中的环境变量不同。在

我猜您有一个.profile文件或类似的行:

PATH=/usr/local/bin:$PATH

但只有在打开shell时才会执行该文件,而不是从其他进程中执行该文件。显然,/usr/bin/python中有一个不同版本的Python,它没有markdown模块。在

相关问题 更多 >