Активировать virtualenv с помощью скрипта Python - PullRequest
75 голосов
/ 04 августа 2011

Я хочу активировать экземпляр virtualenv из скрипта Python.

Я знаю, что это довольно легко сделать, но все примеры, которые я видел, используют его для запуска команд в env, а затем закрывают подпроцесс.

Я просто хочу активировать virtualenv и вернуться в оболочку так же, как это делает bin / activ.

Примерно так:

$me: my-script.py -d env-name
$(env-name)me:

Возможно ли это?

Соответствующий:

virtualenv ›Вызов env из сценария

Ответы [ 8 ]

68 голосов
/ 10 февраля 2013

Если вы хотите запустить подпроцесс Python под virtualenv, вы можете сделать это, запустив скрипт с использованием интерпретатора python, который находится в каталоге / bin / virtualenv:

# path to a python interpreter that runs any python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

Однако, если вы хотите активировать virtualenv в текущем интерпретаторе python вместо подпроцесса, вы можете использовать скрипт activate_this.py:

# doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))
20 голосов
/ 04 августа 2011

Оказывается, что да, проблема не простая, но решение есть.

Сначала я должен был создать сценарий оболочки, чтобы обернуть команду «source». Тем не менее, я использовал "." вместо этого, потому что я прочитал, что лучше использовать его, чем источник для скриптов bash.

#!/bin/bash
. /path/to/env/bin/activate

Тогда из моего скрипта на python я могу просто сделать это:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

Вся хитрость заключается в аргументе --rcfile.

Когда выходит интерпретатор Python, он покидает текущую оболочку в активированной среде.

Победа!

19 голосов
/ 30 мая 2015

Самое простое решение для запуска вашего скрипта в интерпретаторе virtualenv - заменить строку shebang по умолчанию на путь к интерпретатору virtualenv, как показано в начале скрипта:

#!/path/to/project/venv/bin/python

Сделать исполняемый скрипт:

chmod u+x script.py

Запустите скрипт:

./script.py

Вуаля!

8 голосов
/ 14 апреля 2014

Чтобы запустить другую среду Python в соответствии с официальной документацией Virtualenv , в командной строке вы можете указать полный путь к исполняемому двоичному файлу Python, только это (не нужно активировать virtualenv раньше):

/path/to/virtualenv/bin/python

То же самое применимо, если вы хотите вызвать скрипт из командной строки с помощью virtualenv, вам не нужно активировать его раньше:

me$ /path/to/virtualenv/bin/python myscript.py

То же для среды Windows (из командной строки или из скрипта):

> \path\to\env\Scripts\python.exe myscript.py
6 голосов
/ 04 августа 2013

Просто простое решение, которое работает для меня.Я не знаю, зачем вам нужен bash-скрипт, который в основном делает бесполезный шаг (я не прав?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

Который в основном делает то, что вам нужно:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py 
(flask)[hellsing@silence Foundation]$ 

Затемдля деактивации venv, просто Ctrl + D или выход.
Это возможное решение или не то, что вы хотели?

2 голосов
/ 04 августа 2011

Дочерний процесс env теряется в тот момент, когда он перестает существовать, и перемещение содержимого среды оттуда к родителю несколько сложно.

Что вам, вероятно, нужно сделать, это создать сценарий оболочки (вы можете сгенерироватьодин динамически в / tmp), который будет выводить переменные среды virtualenv в файл, который вы затем читаете в родительском процессе Python и помещаете в os.environ.

Или вы просто анализируете активированный скрипт при использовании для строки в открытом(«bin / activ») и вручную извлеките материал и поместите в os.environ.Сложно, но не невозможно.

0 голосов
/ 11 февраля 2019

Верхний ответ работает только для python2.x

Для Python 3.x используйте это.

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

ссылка: Какая альтернатива execfile в Python 3?

0 голосов
/ 29 декабря 2018

Вы должны создать все ваши virtualenv в одной папке, например, virt.

Предполагая, что ваше имя папки virtualenv является virt, если не измените его

cd mkdir custom

скопировать строки ниже ...

#!/usr/bin/env bash ENV_PATH="$HOME/virt/$1/bin/activate" bash --rcfile $ENV_PATH -i

создайте файл сценария оболочки и вставьте надстрочные строки. , .

touch custom/vhelper nano custom/vhelper

предоставить исполняемый файл разрешению для вашего файла

sudo chmod +x custom/vhelper

теперь экспортируйте этот путь к пользовательской папке, чтобы вы могли найти его в командной строке, нажав вкладку ...

export PATH=$PATH:"$HOME/custom"

Теперь вы можете использовать его из любого места, просто набрав команду ниже ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

предположим, что тогда это abc ...

vhelper abc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...