Модуль не может быть найден при использовании pythonw (вместо python) для запуска приложения

Я попробовал этот минимальный пример:

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 взаимозаменяемы, хотя в данном случае это не так.

Вы бы имели представление о том, что происходит?

(Вопрос Код, который работает с python, а не с pythonw не отвечает на вопрос, несмотря на похожее название.)


person Thibaud    schedule 25.09.2014    source источник
comment
Вы уверены, что ваши python и pythonw относятся к одной и той же установке Python? Из командной строки запустите каждый, затем import sys; print sys.executable, sys.path и посмотрите, что они говорят.   -  person abarnert    schedule 26.09.2014
comment
Подождите секунду, это Mac, а не Windows… просто which python и which pythonw в приглашении bash сделают это. И я на 90% уверен, что уже знаю, что вы тоже увидите.   -  person abarnert    schedule 26.09.2014


Ответы (1)


Проблема в том, что ваши pythonw и python не указывают на одни и те же установки Python.

Почему?

Скорее всего, потому что вы установили второй Python 2.7, который не включает устаревший pythonw, но предустановленный Apple Python 2.7 определенно включает его.

Самый быстрый способ проверить это — команда which. Например, на одной из моих машин:

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

Первый является символической ссылкой на установку Python 2.7 для Homebrew, а второй — Python 2.7 от Apple. Ваши точные данные могут отличаться; первый может быть символической ссылкой на /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, который должен управлять этим…)

person abarnert    schedule 25.09.2014
comment
Ты прав. python ссылался на виртуальную среду python, которая сама ссылалась на Homebrew python, тогда как pythonw напрямую связывалась с Homebrew pythonw. Причина в том, что pythonw не включен в каталог, когда virtualenv venv и цель virtualenv как раз и состоит в том, чтобы изолировать пакеты, даже если исполняемые файлы ссылаются на одну и ту же конечную точку. - person Thibaud; 26.09.2014
comment
@Thibaud: Ах, я не думал о virtualenv, потому что я никогда не настраивал IDE для работы с virtualenv, но я вижу, как это может вызвать проблему. Итак, детали в моем ответе на самом деле неверны; как вы думаете, я должен отредактировать это? - person abarnert; 26.09.2014
comment
Я не упомянул virtualenv в своем вопросе, поэтому ваш ответ вполне подходит, потому что он достаточно общий, чтобы его можно было применять в обоих случаях, и в то же время достаточно точный, чтобы я понял проблему. - person Thibaud; 27.09.2014