Подтвердить что ты не робот

Запуск python script из виртуального виртуального диска не работает

У меня есть script Я хочу быть доступным по всему миру. Я начал его со стандартного hashbang:

#! /usr/bin/env python

И связал его в каталог bin моего virtualenv:

~/environments/project/env/bin/myscript

И добавил этот каталог на мой путь. Когда я запускаю команду:

myscript

Я получаю ошибку импорта с одной из библиотек. Однако, если я активирую виртуальную среду и запускаю script, она работает как ожидалось.

Я исключил проблему с symlink (я также попытался просто перемещать script внутри папки bin). Я также попытался запустить script с помощью python

python ~/environments/project/env/bin/myscript

Раньше я использовал script, который активировал среду, а затем запустил мой script, но я был под впечатлением, что script, запущенный из этой папки, должен запускаться с использованием виртуалистического интерпретатора и пакетов сайтов. Любые идеи, почему это может не работать, или каким-то образом я могу отладить это?

4b9b3361

Ответ 1

Поместите script в корзину вашего виртуального сервера, а затем добавив, что местоположение бина в вашей глобальной PATH не будет автоматически генерировать ваш virtualenv. Сначала вам нужно указать его, чтобы сделать его активным.

Все, что ваша система знает, это проверить дополнительный путь к исполняемому файлу и запустить его. В этом script нет ничего, указывающего на virtualenv.

Вы могли бы, однако, жестко привязать строку she-bang к вашему виртуальному python, и в этом случае сайт-пакеты попадут на путь:

#!/Users/foo/environments/project/env/bin/python

Или другой вариант состоит в том, чтобы просто создать крошечную оболочку bash, которая вызывает ваши исходные питоны script, что позволит вам оставить свой оригинальный script общий ролик.

Итак, если myscript.py: #!/usr/bin/env python...

Затем вы можете сделать myscript:

#!/bin/bash

/Users/foo/environments/project/env/bin/python myscript.py

Когда вы выполните myscript, он явно вызовет ваш python script с помощью установленного вами интерпретатора.

Ответ 2

Я думаю, вы смущены тем, как работает virtualenv.

Вкратце, virtualenv изменяет среду оболочки, чтобы Python будет искать в разных областях для поиска модулей, которые вы хотите импортировать. Там действительно нет никакой связи между тем, где вы храните свою виртуальную среду и где вы храните исходные файлы, которые вы запускаете в virtualenv. Если бы вы захотели, вы могли бы сохранить свой virtualenv в каталоге с именем ~/environment/my_env и всем исходным кодом, который вы используете при использовании виртуального файла в ~/projects/my_proj.

Вы можете больше узнать о том, что virtulenv делает в документах.

Действительно, единственное, что говорит python, где найти модули, полностью основано на python (видеть документы о том, как это работает). Активация virtualenv изменяет способ работы python.

Вы можете вернуться к тому, чтобы оболочка script активировала virtualenv для вас, или вы можете следовать этот рецепт, чтобы активировать его непосредственно из ваш script.

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

Если вы выберете этот маршрут, сохраните информацию, которую должны знать документы:

Это изменит sys.path и даже изменит sys.prefix, но также позволит вы должны использовать существующий интерпретатор. Элементы вашей среды будут сначала появляйтесь на sys.path, перед глобальными элементами. Однако глобальные позиции всегда будет доступным (как будто флаг -system-site-packages использовались при создании среды, независимо от того, было это или нет). Также, это не может отменить активацию других сред или модулей, которые были импортированы. Вы не должны пытаться, например, активировать среда перед веб-запросом; вы должны активировать одну среду как можно раньше, и не делать этого снова в этом процессе.

Ответ 3

Не могли бы вы просто добавить относительный путь? Это сработало для меня:

#!./env/bin/python

Ответ 4

Я столкнулся с той же проблемой и придумал это решение: https://github.com/jabbalaci/wpython. Это script называется "wpython", который вызывает вашу программу с помощью локального интерпретатора Python в вашем вену. Таким образом, вместо "/Users/foo/environments/project/env/bin/python myscript.py" достаточно написать "wpython /path/to/myscript.py". Пусковая установка script может выглядеть так:

#!/usr/bin/env bash

cd /the/directory/where/myscript.py/is/located
wpython myscript.py

Ответ 5

Если вы используете окна, вы можете включить следующую строку в начало файла python.

#! P:\Workspace\pythontut\Scripts python