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

时间:2013-04-07 23:49:23

标签: python python-2.7 shebang

OSX 10.8.2上的Python 2.7.3

我正在编写一个导入markdown模块的脚本。我使用#!/usr/bin/env python shebang来实现可移植性。当我通过./myscript.py arg1

直接在shell中运行脚本时,脚本运行正常

当我从(登录)shell外部运行脚本时,例如通过AppleScript do 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
  3. 的情况下避免此问题

2 个答案:

答案 0 :(得分:3)

#!/usr/bin/env python表示“在python上查找$PATH,就像shell正在寻找它一样,然后运行它。”所以,由于你得到不同的结果,你可能正在使用不同的蟒蛇。

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

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

(第一个是由MacPorts安装的。)

无论如何,正如罗德里戈指出的那样,直接发射可能不会使用你期望的$PATH。这意味着使用/usr/bin/env无效。

答案 1 :(得分:1)

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

我的猜测是你有一个.profile文件或类似的行:

PATH=/usr/local/bin:$PATH

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