Запуск скрипта python изнутри virtualenv bin не работает
у меня есть сценарий, который я хочу быть доступным по всему миру. Я начал его со стандартного hashbang:
#! /usr/bin/env python
и связал его в каталог bin моего virtualenv:
~/environments/project/env/bin/myscript
и добавил этот каталог в мой путь. Когда я запускаю команду:
myscript
Я получаю ошибку импорта с одной из библиотек. Однако, если я активирую виртуальную среду и запускаю сценарий, он работает так, как ожидалось.
Я исключил проблему с символической ссылкой (Я также попытался просто переместить скрипт внутри папки bin). Я также попытался запустить скрипт с Python
python ~/environments/project/env/bin/myscript
ранее я использовал скрипт, который активировал среду, а затем запустил мой скрипт, но у меня сложилось впечатление, что скрипт, запущенный из этой папки, должен работать с интерпретатором virtualenv и пакетами сайта. Любые идеи о том, почему это может не работать или каким-то образом я мог бы отладить это?
5 ответов
помещая скрипт в корзину вашего virtualenv, а затем добавляя это местоположение в свой глобальный путь, вы автоматически не получите virtualenv. Вам нужно сначала его источник, чтобы сделать его активным.
все, что ваша система знает, это проверить этот дополнительный путь для исполняемого файла и запустить его. В этом скрипте нет ничего, указывающего на virtualenv.
вы можете, однако, жестко закодировать линию she-bang на свой virtualenv python, в этом случае site-пакеты окажутся на пути:
#!/Users/foo/environments/project/env/bin/python
или другой вариант-просто создать крошечную оболочку bash, которая вызывает ваш оригинальный скрипт pythons, который позволит вам оставить свой оригинальный скрипт с общим she-bang..
так если myscript.py есть:#!/usr/bin/env python
...
тогда вы можете сделать myscript
:
#!/bin/bash
/Users/foo/environments/project/env/bin/python myscript.py
когда вы myscript
, он будет явно вызывать ваш скрипт python с помощью интерпретатора, который вы настроили.
Я думаю, вы смущены тем, как работает virtualenv.
в двух словах, virtualenv изменяет среду оболочки, так что Python будет искать в разных областях, чтобы найти модули, которые вы хотите импортировать. На самом деле нет никакой связи между тем, где вы храните свою виртуальную среду и где вы храните свои исходные файлы, которые вы запускаете в virtualenv. Если вы хотите, вы можете сохранить virtualenv в каталоге с именем ~ / environments/ my_env и весь источник, который вы кодируете при использовании virtualenv в ~ / projects / my_proj.
вы можете прочитать больше о что делает virtulenv в документации.
действительно, единственное, что говорит python, где найти модули, полностью основано на python (посмотреть документы о том, как он работает). Активация virtualenv изменяет способ работы python.
вы можете вернуться к тому, чтобы сценарий оболочки активировал virtualenv для вас, или вы можете следовать этот рецепт чтобы активировать его непосредственно из вашего скрипта.
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
Если вы выбираете этот маршрут, имейте в виду информацию, которую дают документы:
это изменит sys.путь и даже изменение sys.префикс, но также позволяет вы должны использовать существующий интерпретатор. Товаров в вашей среде сначала покажите на sys.путь перед глобальными элементами. Однако глобальные вопросы всегда будет доступен (как если бы флаг --system-site-packages имел используется при создании среды, было это или нет). Также, это не может отменить активацию других сред или модулей, которые были импортированы. Вы не должны пытаться, например, активировать среда перед веб-запросом; необходимо активировать одну среду как можно раньше, и не делайте этого снова в этом процессе.
Не могли бы вы просто добавить относительный путь вместо этого? Это сработало для меня:
#!./env/bin/python
я столкнулся с той же проблемой и придумал это решение:https://github.com/jabbalaci/wpython. Это сценарий под названием"wpython
" это вызывает вашу программу с локальным интерпретатором Python в вашем venv. Таким образом, вместо "/Users/foo/environments/project/env/bin/python myscript.py
" достаточно написать "wpython /path/to/myscript.py
". Сценарий запуска может выглядеть так:
#!/usr/bin/env bash
cd /the/directory/where/myscript.py/is/located
wpython myscript.py
Если вы используете windows, вы можете включить следующую строку в верхней части файла python.
#! P:\Workspace\pythontut\Scripts python