Активуйте virtualenv за допомогою сценарію Python


89

Я хочу активувати екземпляр virtualenv зі сценарію Python.

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

Я просто хочу активувати virtualenv і повернутися до оболонки так само, як це робить bin / activate.

Щось на зразок цього:

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

Чи можливо це?

Відповідне:

virtualenv ›Виклик env зі сценарію

Відповіді:


86

Якщо ви хочете запустити підпроцес Python під virtualenv, ви можете зробити це, запустивши скрипт, використовуючи інтерпретатор Python, який живе всередині каталогу / bin / virtualenv:

import subprocess

# 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))

1
//, Чи не слід цей останній рядок у першому блоці коду цієї відповіді читати так subprocess.Popen([venv_python_file, script_file]):?
Натан Басанес

//, також, чи є спосіб запустити файл script_fileіз довільного розташування, або він повинен бути в virtualenvкаталозі?
Натан Басанес

Виправлено, дякую, що помітили помилку. Що стосується Вашого другого питання, script_fileне обов'язково, щоб воно було в каталозі virtualenv, воно може бути де завгодно.
Lie Ryan

Як я можу деактивувати віртуальну env, якщо я використовую другу опцію?
falsePockets

@falsePockets: XY Проблема , чому ти коли-небудь хочеш це зробити?
Lie Ryan

42

Найпростішим рішенням для запуску вашого сценарію під інтерпретатором virtualenv є заміна рядка shebang за замовчуванням на шлях до інтерпретатора вашого virtualenv так, як на початку сценарію:

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

Зробіть скрипт виконуваним:

chmod u+x script.py

Запустіть сценарій:

./script.py

Вуаля!


2
+1 за елегантність. Зауважте, для Windows для цього потрібне середовище, сумісне з posix, яке розуміє рядки shebang, такі як cygwin або msys
qneill

1
Працює для python 3.6.3 та Windows 10!
toonarmycaptain

Думаю, я міг неправильно зрозуміти початкове питання. Він хоче активувати віртуальне середовище сценарієм і повернутися до оболонки з активованим середовищем. Моя відповідь запускає сценарій у віртуальному середовищі, але повернена оболонка не зберігає середовище. Сучасне рішення - virtualenvwrapper: virtualenvwrapper.readthedocs.io/en/latest/# . Це дозволяє активувати та перемикатися між різними віртуальними програмами.
nafooesi

20

Виявляється, так, проблема не проста, але рішення є.

Спочатку мені довелося створити сценарій оболонки, щоб обернути команду "source". Тобто я використовував "." натомість, тому що я вже читав, що краще використовувати його, ніж джерело для скриптів Bash.

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

Тоді з мого сценарію Python я можу просто зробити це:

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

Весь фокус полягає в --rcfileсуперечці.

Коли інтерпретатор Python виходить, він залишає поточну оболонку в активованому середовищі.

Перемагай!


3
Я справді не розумію. Чому б вам просто не зробити цього: os.system('/bin/bash --rcfile path/to/env/activate') Ви знаєте, коли екземпляр bash запускається, він бере .bashrc як аргумент для --rcfile. Тож просто вкажіть, що rcfile - це ваш файл активації ... Ні?
Депадо

@Depado Я щойно спробував ваше рішення, і це активує оболонку в python. принаймні, коли я пробую це в оболонці. >>> os.system ('/ bin / bash --rcfile / var / envs / test / bin / activate') (test) tcraig @ tallis-desktop: ~ $ (test) tcraig @ tallis-desktop: ~ $ ls -l загалом 706288
Трентон

Можливо, але це працює в сценарії. Єдиним незручним за допомогою цієї техніки є те, що ви не отримуєте всіх своїх псевдонімів і всього, що було у вас в ~ / .bashrc. Але мені це добре. Наприклад, команда "ls" не має кольору. Але у мене все працює. Коли я хочу піти, я просто Ctrl + D
Депадо

7
"Коли інтерпретатор python виходить, він залишає поточну оболонку в активованому середовищі" Що? Він породжує абсолютно нову оболонку як підпроцес і чекає, поки не закінчиться.
Кос

Щоб уникнути створення нових файлів у моєму сховищі, а також реплікації поточної конфігурації bash, я зробив cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
наступне

17

Щоб запустити інше середовище 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

2
Запитання: Активуйте virtualenv за допомогою сценарію python (НЕ від Shell)
Zaheer

3
Так, я хочу сказати, що ви можете просто зателефонувати до середовища виконання python із віртуального середовища без необхідності активувати його раніше, з консолі або зі сценарію. Я уточню відповідь, дякую!
Маріано Руїс,

О Боже мій! Я про це не думав. це єдине рішення, яке працювало для мене :). Тепер, коли я виконання пітона скрипт PHP, я використовую: «шлях / к / virtualenv / bin / пітон mypythonscript.py»
Захір

6

Просто просте рішення, яке мені підходить. Я не знаю, навіщо вам потрібен сценарій Bash, який в основному робить марний крок (я помиляюся?)

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

Що в основному робить те, що вам потрібно:

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

Тоді, замість того, щоб деактивувати віртуальне середовище, просто Ctrl+ Dабо вихід. Це можливе рішення чи це не те, що ви хотіли?


2

Навколишнє середовище процесу втрачається в той момент, коли воно перестає існувати, і переміщення вмісту оточення звідти до батьківського є дещо складним.

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

Або ви просто аналізуєте сценарій активації, використовуючи для відкритого рядка ("bin / activate"), вручну витягуєте матеріали і поміщаєте в os.environ. Це складно, але не неможливо.


2
Ви маєте на увазі щось подібне? bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/…
h3.

2

Верхня відповідь працює лише для Python 2.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?


1
what is activate_this.py
randy Pen

1
@randyPen, файл activate_this.py автоматично додається під час створення virtualenv у каталозі вашого проекту. (тобто /project/directory/venv/bin/activate_this.py)
Теоретично

-2

Ви повинні створити всі свої virtualenvs в одній папці, наприклад 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

Тепер експортуйте цей шлях до спеціальної папки, щоб ви могли знайти його в командному рядку, натиснувши вкладку ...

експортувати PATH = $ PATH: "$ HOME / custom"

Тепер ви можете використовувати його з будь-якого місця, просто ввівши команду нижче ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

Припустимо, це abc тоді ...

vhelper abc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.