Вопрос по python, virtualenv, rundeck – Запуск скрипта Python изнутри virtualenv bin не работает

25

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

#! /usr/bin/env python

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

~/environments/project/env/bin/myscript

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

myscript

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

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

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

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

Не имеет отношения к вашему вопросу: хотя большинство оболочек игнорируют его, используя#! / Строго говоря, это неправильно, так как пространство должно рассматриваться как часть пути программы. Оставьте пространство, и вы в безопасности. kay

Ваш Ответ

5   ответов
41

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

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

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

#!/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 с установленным вами интерпретатором.

Разве вы не должны использовать myscript вместо того, чтобы просто называть его по имени?
Спасибо за то, что сделал мой оригинальный сценарий. У меня было воспоминание о том, что я видел что-то, что, как мне показалось, сказал, что папка активирует окружение, но вы правы, подумав, я вижу, что это будет невозможно. justin
@JoshUsre нет, myscript в этом случае является загрузчиком, который запускает myscript.py определенным образом. Сценарии поиска - это то, что вы делаете, когда хотите, чтобы эффекты сценария оценивались в текущей оболочке.
0

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

#!/usr/bin/env bash

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

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

Короче говоря, virtualenv изменяет среду оболочки так, что Python будет искать в разных областях модули, которые вы хотите импортировать. На самом деле нет никакой связи между тем, где вы храните вашу виртуальную среду и где вы храните исходные файлы, которые вы запускаете в virtualenv. Если вы хотите, вы можете сохранить ваш virtualenv в каталоге ~ / environment / 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))

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

This will change sys.path and even change sys.prefix, but also allow you to use an existing interpreter. Items in your environment will show up first on sys.path, before global items. However, global items will always be accessible (as if the --system-site-packages flag had been used in creating the environment, whether it was or not). Also, this cannot undo the activation of other environments, or modules that have been imported. You shouldn’t try to, for instance, activate an environment before a web request; you should activate one environment as early as possible, and not do it again in that process.

2

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

#!./env/bin/python
0

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

#! P:\Workspace\pythontut\Scripts python

Похожие вопросы