Chcę aktywować instancję virtualenv ze skryptu w języku Python.
Wiem, że jest to całkiem łatwe, ale wszystkie przykłady, które widziałem, używają go do uruchamiania poleceń w środowisku env, a następnie zamykania podprocesu.
Chcę po prostu aktywować virtualenv i wrócić do powłoki, w ten sam sposób, w jaki robi to bin / Activ.
Coś takiego:
$me: my-script.py -d env-name
$(env-name)me:
czy to możliwe?
Istotnych:
python
virtualenv
h3.
źródło
źródło
subprocess.Popen([venv_python_file, script_file])
:?script_file
z dowolnej lokalizacji, czy też musi on znajdować się wvirtualenv
katalogu?script_file
, nie musi znajdować się w katalogu virtualenv, może być wszędzie.Najprostszym rozwiązaniem do uruchomienia skryptu z interpretera virtualenv jest zastąpienie domyślnej linii shebang ścieżką do interpretera virtualenv, tak jak na początku skryptu:
#!/path/to/project/venv/bin/python
Spraw, aby skrypt był wykonywalny:
Uruchom skrypt:
Voila!
źródło
Okazuje się, że tak, problem nie jest prosty, ale rozwiązanie jest.
Najpierw musiałem stworzyć skrypt powłoki, aby opakować polecenie „source”. To powiedziawszy, użyłem znaku „.” zamiast tego, ponieważ czytałem, że lepiej go używać niż źródła dla skryptów Bash.
#!/bin/bash . /path/to/env/bin/activate
Następnie z mojego skryptu Python mogę po prostu zrobić to:
import os os.system('/bin/bash --rcfile /path/to/myscript.sh')
Cała sztuczka tkwi w
--rcfile
sporze.Kiedy interpreter Pythona kończy pracę, pozostawia bieżącą powłokę w aktywowanym środowisku.
Zdobyć!
źródło
os.system('/bin/bash --rcfile path/to/env/activate')
wiesz, kiedy uruchamiane jest wystąpienie bash, pobiera on .bashrc jako argument dla --rcfile. Więc po prostu określ, że plik rc jest twoim plikiem aktywacyjnym ... Nie?cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
Aby uruchomić inne środowisko Pythona zgodnie z oficjalną dokumentacją Virtualenv , w wierszu poleceń możesz określić pełną ścieżkę do wykonywalnego pliku binarnego Pythona, po prostu (nie ma potrzeby wcześniejszego aktywowania virtualenv):
To samo dotyczy sytuacji, gdy chcesz wywołać skrypt z wiersza poleceń za pomocą virtualenv. Nie musisz go wcześniej aktywować:
To samo dla środowiska Windows (niezależnie od tego, czy pochodzi z wiersza poleceń, czy ze skryptu):
źródło
Po prostu proste rozwiązanie, które działa dla mnie. Nie wiem, dlaczego potrzebujesz skryptu Bash, który w zasadzie wykonuje bezużyteczny krok (czy się mylę?)
import os os.system('/bin/bash --rcfile flask/bin/activate')
Który w zasadzie robi to, czego potrzebujesz:
[hellsing@silence Foundation]$ python2.7 pythonvenv.py (flask)[hellsing@silence Foundation]$
Następnie zamiast dezaktywować środowisko wirtualne, po prostu Ctrl+ Dlub zakończ. Czy to możliwe rozwiązanie, czy nie tego chciałeś?
źródło
Środowisko procesu dziecka jest tracone w momencie, gdy przestaje istnieć, a przeniesienie zawartości środowiska z tego środowiska do rodzica jest nieco trudne.
Prawdopodobnie musisz stworzyć skrypt powłoki (możesz wygenerować go dynamicznie do / tmp), który wyprowadzi zmienne środowiskowe virtualenv do pliku, który następnie odczytujesz w nadrzędnym procesie Pythona i umieszczasz w os.environ.
Lub po prostu analizujesz skrypt aktywacyjny, używając polecenia dla linii w open („bin / Activ”), ręcznie wyodrębniasz rzeczy i umieszczasz w os.environ. To trudne, ale nie niemożliwe.
źródło
Najlepsza odpowiedź działa tylko w Pythonie 2.x.
W przypadku Pythona 3.x użyj tego:
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))
Odniesienie: Jaka jest alternatywa dla pliku execfile w Pythonie 3?
źródło
Powinieneś utworzyć wszystkie swoje
virtualenv
pliki w jednym folderze, takim jakvirt
.Zakładając, że nazwa twojego folderu virtualenv to virt, jeśli nie, zmień ją
Skopiuj poniższe wiersze ...
#!/usr/bin/env bash ENV_PATH="$HOME/virt/$1/bin/activate" bash --rcfile $ENV_PATH -i
Utwórz plik skryptu powłoki i wklej powyższe wiersze ...
Przyznaj uprawnienia wykonywalne do swojego pliku:
Teraz wyeksportuj tę niestandardową ścieżkę folderu, aby można ją było znaleźć w wierszu poleceń, klikając kartę ...
export PATH = $ PATH: "$ HOME / niestandardowe"
Teraz możesz go używać z dowolnego miejsca, po prostu wpisując poniższe polecenie ...
Załóżmy, że to abc ...
źródło