Как я могу активировать pyvenv vitrualenv изнутри python? (activate_this.py был удален?)
Я использую Python 3.4, и, создав pyvenv, я хочу активировать его из процесса python. С virtualenv я использовал activate_this.py
, но, похоже, ушел в pyvenv.
Есть ли теперь простой способ эффективного изменения текущего интерпретатора в интерпретаторе virtualenv? Вероятно, я мог бы повеселиться с PATH (что было activate_this.py
), но я хотел бы сделать более простой и стабильный способ.
Это используется для использования в wsgi.py.
Ответы
Ответ 1
pyvenv
, а модуль venv
не поддерживает это. Третий пакет virtualenv
поддерживает это с помощью activate_this.py
, но эта функция не была включена во встроенный модуль venv
.
Вы можете попытаться взять копию activate_this.py
из среды virtualenv
; это работает, хотя я не могу поклясться, что это будет идеально (venv
/pyvenv
использует некоторую магию во время запуска, неясно, все ли реплицировано через activate_this.py
).
Документы virtualenv
для него устарели для Python 3 (они утверждают, что вы используете execfile
, которого не существует). Альтернативой Python 3 является:
activator = 'some/path/to/activate_this.py' # Looted from virtualenv; should not require modification, since it defined relatively
with open(activator) as f:
exec(f.read(), {'__file__': activator})
Ничего activate_this.py
не является волшебным, поэтому вы можете вручную выполнять те же самые изменения без махинации с virtualenv
(настройка PATH
, sys.path
, sys.prefix
и т.д.), но заимствование делает его намного проще в этот случай.
Ответ 2
Я использовал другой подход, используемый в virtualenv
:
# the current Python interpreter is not from the virtual environment
file = __file__
if file.endswith('.pyc'):
file = file[:-1]
venv_executable = PROJECT_DIR / 'venv' / 'bin' / 'python'
popen = subprocess.Popen([venv_executable, file] + sys.argv[1:])
raise SystemExit(popen.wait())
Ответ 3
import argparse
import base64
import os
import zlib
from pathlib import Path
def convert(s):
b = base64.b64decode(s.encode('ascii'))
return zlib.decompress(b).decode('utf-8')
ACTIVATE_THIS = convert("""
eJyNU01v2zAMvetXEB4K21jnDOstQA4dMGCHbeihlyEIDMWmE62yJEiKE//7kXKdpEWLzYBt8evx
kRSzLPs6wiEoswM8YdMpjUXcq1Dz6RZa1cSiTkJdr86GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe
5a3p0cRKiEe2NtLAFikftnDco0ko/SFEVgEZ8aRCZDIPY9xbA8pE9M4jfW/B2CjiHq9zbJVZuOQq
siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C+qisSZYiWfjJfs+0/MFMdWn1hJcO5U7G/SLa
xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb
yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF
7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py
m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC
6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw
VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
""")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--virtualenv-dir', default=os.environ['VIRTUAL_ENV'])
args = parser.parse_args()
activate_this_path = Path(args.virtualenv_dir) / 'bin/activate_this.py'
print(f'Writing activate_this.py to {activate_this_path}')
with open(activate_this_path, 'w') as fp:
fp.write(ACTIVATE_THIS)
Я взял это из самого проекта virtualenv
. здесь искать ACTIVATE_THIS
Сценарий запишет activ_this.py в вашу корзину виртуальной среды.
С поэзией можно делать:
poetry run python venv_activate_this.py
Для python venv сделайте:
source venv/bin/activate
python venv_activate_this.py
И из любого места вы можете сделать:
python3 venv_activate_this.py --virtualenv-dir /wherever/that/is
Теперь вы можете использовать vim с python и понять, как активировать правильную виртуальную среду для таких вещей, как ALE и YCM.
Также хранится в виде гистограммы здесь: https://gist.github.com/nackjicholson/db83869b7931b0bc95fa9e0960921f1c