我尝试了以下最小示例:
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尽管标题相似,但并未回答。)
最佳答案
问题是您的pythonw
和python
没有指向相同的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的符号链接,而第二个是苹果的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
的设置应该可以控制它……)关于python - 使用“pythonw”(而不是“python”)运行应用程序时找不到模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26049778/