2

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

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自己时,会引发同样的错误。

从 Python 2.5 开始,python 和 pythonw的man pythonw状态是可以互换的,尽管在这种情况下它们似乎不是。

你知道会发生什么吗?

适用于 python 而不是 pythonw 的问题代码尽管标题相似,但无法回答该问题。)

4

1 回答 1

2

问题是你pythonw和你python没有指向相同的 Python 安装。

为什么?

很可能是因为您安装了第二个不包含 obsolete 的 Python 2.7 pythonw,但 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——或者,更好的是,给它一个 Python 解释器的绝对路径,以/usr/local/bin/python2.7确保您绝对知道您正在运行什么。

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

于 2014-09-25T23:36:39.820 回答