使用" pythonw"时无法找到模块。 (而不是" python")来运行一个应用程序

时间:2014-09-25 23:31:42

标签: python macos textmate pythonw

我尝试了这个最小的例子:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug = True)

当我尝试python hello.py时,一切顺利。但是,当我尝试从Textmate(Shift + Cmd + R)运行它时会抛出错误:

Traceback (most recent call last):
  File "/Users/user/EventFeed/hello.py", line 1, in <module>
    from flask import Flask
ImportError: No module named flask

Textmate拨打pythonw而不是python。当我自己尝试pythonw时,会抛出同样的错误。

man pythonw表示从Python 2.5开始,python和pythonw是可以互换的虽然它们似乎不是这种情况。

您是否了解会发生什么?

(问题Code that works with python and not with pythonw虽然标题相似,却没有回答这个问题。)

1 个答案:

答案 0 :(得分:2)

问题是您的pythonwpython没有指向相同的Python安装。

为什么?

最有可能的原因是你已经安装了第二个不包含过时的pythonw的Python 2.7,但Apple预装的Python 2.7肯定 包含它。

检查此问题的最快方法是which命令。例如,在我的一台机器上:

$ which python
/usr/local/bin/python
$ which pythonw
/usr/bin/pythonw

第一个是Homebrew安装的Python 2.7的符号链接,而第二个是Apple的Python 2.7。您的具体细节可能不同;第一个可能是/Library/Frameworks/Python.framework/Versions/2.7/bin/python的符号链接,或实际存在于/usr/local/bin中的包装可执行文件,或者可能位于/opt/local中,等等。重点是它们不在相同的目录。

无论如何,你的两个单独的Python安装不共享相同的站点包(他们不应该这样),所以你为第二个安装了Flask的事实对Apple没有帮助。您可以通过运行它们并打印sys.path

来验证这一点
$ python
>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.7/site-packages', …]
>>> ^D
$ pythonw
>>> import sys
>>> sys.path
['', '/Library/Python/2.7/site-packages', …]
>>> ^D

无论如何,最简单的解决方案是将编辑器配置为运行python而不是pythonw - 或者更好的是,给它一个绝对的路径来完成像/usr/local/bin/python2.7这样的Python解释器确定你知道你在跑什么。

(我不太了解TextMate,但是从this source看起来它有一个名为TM_PYTHON的设置应该控制它......)