2013-04-07 4 views
5

Python 2.7.3 on OSX 10.8.2Почему использование/usr/bin/env прерывает мой импорт Python?

В настоящее время я пишу скрипт, который импортирует модуль уценки. Я использовал #!/usr/bin/env python shebang для переносимости. Скрипт работает нормально, когда я запускаю его непосредственно в оболочке через ./myscript.py arg1

Когда я запускаю скрипт из наружной части (логин) оболочки, например, с помощью 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?
+0

Я не думаю, что он использует '/ usr/bin/env python' столько же, сколько с использованием оболочки без входа. Я предполагаю, что '/ usr/local/bin' не находится в' PATH' в такой оболочке или, по крайней мере, не до '/ usr/bin', что объясняет, почему выбрано' python' в последнем. Вы меняете 'PATH' в своих конфигурационных файлах bash? – millimoose

+0

Недостаток, о котором я забыл, заключается в том, что оба метода '#!/Usr/bin/env python' и' #!/Usr/local/bin/python' отлично работали в TextWrangler, и оба дали мне одинаковые результаты при запуске в Terminal. Это вызвало это только от AppleScript, вызвавшего ошибку (Rodrigo корректно). Хотя TextWrangler и Terminal дали мне одинаковые результаты, я смог увидеть разницу, запустив «make shell script» (echo «import sys»; echo 'print sys.path';) |/usr/bin/env python " в редакторе AppleScript. 'make shell script ', который python" 'был бы еще проще. – n8henrie

ответ

3

#!/usr/bin/env python означает: «Идите, найдите python на $PATH, как будто он искал его, и запустил это». Поэтому, поскольку вы получаете разные результаты, вы, вероятно, используете разные питоны.

Чтобы проверить, работает ли работа /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.)

Во всяком случае, так как Rodrigo указывает, прямой запуск, вероятно, не используя $PATH вы ожидаете. Это означает, что использование /usr/bin/env не будет работать.

+0

Ваш ответ объясняет характер проблемы, но не как ее решить. –

+1

Простейшим решением является использование '#!/Usr/local/bin/python' или изменение вашего AppleScript на' make shell script '/ usr/local/bin/python /path/to/myscript.py & quot; arg1'. –

+0

Я ценю информацию. Два фактора повлияли на мою путаницу: один из них:/usr/local/bin/python и/usr/bin/env python, похоже, дают мне одинаковые результаты - я предполагаю, что это потому, что я выполняю команду из оболочку входа в систему в любом случае. Это также может быть связано с тем, что у меня одинаковые версии Python, установленные в обоих местах, так как запуск этих команд не дает мне путь к python, а только номер версии. – n8henrie

1

Ну, похоже, что переменная среды PATH в вашей оболочке входа отличается от процесса AppleScript.

Я предполагаю, что у вас есть .profile файл или аналогичный с линией:

PATH=/usr/local/bin:$PATH 

Но этот файл выполняется только при открытии оболочки, а не из других процессов. И, очевидно, у вас есть другая версия Python в /usr/bin/python, которая не имеет модуля уценки.

+0

Ваш ответ объясняет характер проблемы, но не как ее решить. –

+0

@JoshCaswell: Ты прав. Лучшим решением было бы изменить систему PATH в широком масштабе или, по крайней мере, на уровне пользователя, чтобы все пользовательские процессы имели один и тот же путь поиска. Но я боюсь, что детали специфичны для системы, и ОП не сказал, что он использует (что-то вроде яблок, может быть). – rodrigo

+1

Большое спасибо за объяснение. Как указано в начале сообщения, я использую OSX 10.8.2. Я могу дать шанс изменить мой путь для не-login-оболочек. – n8henrie

 Смежные вопросы

  • Нет связанных вопросов^_^