2017-01-28 11 views
4

У меня проблема с OSX, что #!/usr/bin/env python3 вызывает переменные окружения, такие как пути к библиотеке (например, LD_LIBRARY_PATH). В Linux он работает правильно.Как использовать `env python3` и сохранить вызывающую среду?

Чтение страницы руководства на env не кажется, что это должно быть сделано. Мне нужно только модифицировать среду, если я ее прошу, а я нет.

Что такое переносная линия shebang, которая сохраняет окружающую среду?

Примечание: Я обнаруживаю проблему, так как вызов subprocess.open на одной из моих программ завершается с ошибкой, так как он не может найти одну из библиотек. Тем не менее, если я запускаю python в интерактивном режиме, тот же самый вызов работает отлично.

+0

Ничего, только * определенные * env vars в текущей оболочке действительно не распространяются, кажется. Я тестировал с общим, и это сработало. –

+0

Это должно произойти только с передачей '-' или' -i' простым просмотром справочной страницы MacOS для 'env'. –

+0

'env env', например, показывает все переменные среды, присутствующие во внутреннем экземпляре. –

ответ

3

Это ОС X System Integrity Protection на работе; некоторые «опасные» переменные среды, такие как DYLD_LIBRARY_PATH, и, как вы обнаружили, LD_LIBRARY_PATH, не передаются ни одному двоичному файлу с помощью пути /usr/bin или /bin.

Как таковой /usr/bin/env никогда не видит ни одну из нескольких переменных окружения и не может передать их дочернему процессу , который он порождает.

Смотреть еще несколько сообщений на эту тему:

Если вы используете subprocess, я бы проверить на притон линии, извлечь двоичный файл с именем env, префикс вашей команды с этим двоичным кодом и обход env в целом.

+0

Для моего вызова подпроцесса я мог бы это сделать, но у меня есть другие скрипты, которые вызывают эти (liek скрипты сборки), которые не имеют контроля над их вызовом. –

+0

В любом случае это действительно отстой. Эта «особенность» OSX очень затрудняет настройку среды разработки. –

+0

Yup, это делает вещи значительно сложнее; избегайте использования '/ usr/bin/env' скриптов, которые нуждаются в доступе к этим переменным, это лучшее, что я могу сделать в данный момент. –