2012-08-15 11 views
21

Mam skrypt, który chcę być dostępny na całym świecie. Zacząłem go ze standardowym hashbang:Uruchamianie skryptu Pythona z wnętrza bin virtualenv nie działa

#! /usr/bin/env python 

i połączone go do katalogu bin mojego virtualenv:

~/environments/project/env/bin/myscript 

i dodał, że katalog na mojej ścieżce. Po uruchomieniu polecenia:

myscript 

Wystąpił błąd importu w jednej z bibliotek. Jeśli jednak aktywuję środowisko wirtualne i uruchomię skrypt, działa zgodnie z oczekiwaniami.

Wykluczyłem problem z dowiązaniem symbolicznym (próbowałem również przesuwać skrypt w folderze bin). Próbowałem zostały również działania skryptu z python

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

Wcześniej używałem skryptu, który aktywowany środowiska i pobiegł mój skrypt, ale byłem pod wrażeniem, że skrypt uruchamiany z tego folderu należy uruchomić z virtualenv-tych interpretator i pakiety site-packages. Jakieś pomysły na to, dlaczego to nie działa, lub niektóre sposoby, w jakie mogę to debugować?

+1

Nie ma związku z pańskim pytaniem: mimo że większość pocisków je ignoruje, używając '#!/'jest ściśle mówiąc źle, jako że przestrzeń musiała być uważana za część ścieżki programu. Opuść przestrzeń i jesteś bezpieczny. – kay

Odpowiedz

35

Umieszczenie skryptu w pojemniku virtualenv, a następnie dodanie tej lokalizacji bin do globalnej ścieżki PATH nie spowoduje automatycznego źródła virtualenv. Najpierw musisz go pobrać, aby był aktywny.

Wszystko, co wie twój system, to sprawdzenie dodatkowej ścieżki do pliku wykonywalnego i uruchomienie go. W tym skrypcie nie ma nic oznaczającego virtualenv.

Mogłeś jednak zakodować linię she-Bang swojej virtualenv Python, w którym to przypadku site-pakiety zakończy się na ścieżce:

#!/Users/foo/environments/project/env/bin/python 

Albo inna opcja to po prostu stworzyć mały bash wrapper, który wywołuje oryginalnego skryptu pytony, które pozwolą Ci zostawić swój oryginalny scenariusz z ogólnej she-hukiem ..

Więc jeśli myscript.py jest: #!/usr/bin/env python ...

Następnie można dokonać myscript:

#!/bin/bash 

/Users/foo/environments/project/env/bin/python myscript.py 

Kiedy robisz myscript będzie jawnie wywołać skrypt Pythona z tłumacza skonfigurowanym.

+0

To właśnie zrobił mój oryginalny scenariusz. Pamiętam, że widziałem coś, co według mnie mówiło, że folder aktywuje środowisko, ale masz rację, zastanawiając się, widzę, że to niemożliwe. – justin

7

Myślę, że nie masz pojęcia, jak działa virtualenv.

W skrócie virtualenv modyfikuje środowisko powłoki tak, aby Python wyglądał w różnych obszarach, aby znaleźć moduły, które chcesz zaimportować. Tak naprawdę nie ma żadnej relacji między miejscem przechowywania środowiska wirtualnego a miejscem przechowywania plików źródłowych uruchamianych w virtualenv. Jeśli chcesz, możesz zapisać swój virtualenv w katalogu o nazwie ~/environments/my_env i całym źródle, które kodujesz podczas używania virtualenv w ~/projects/my_proj.

Możesz przeczytać więcej o what virtulenv does w dokumentach.

Naprawdę, jedyna rzecz, która mówi Pythonowi, gdzie znaleźć moduły, jest całkowicie oparta na pythonie (see the docs, jak to działa). Aktywacja virtualenv zmienia sposób, w jaki działa python.

Możesz wrócić do skryptu powłoki aktywować virtualenv dla Ciebie, lub możesz wykonać this recipe, aby aktywować go bezpośrednio ze swojego skryptu.

activate_this = '/path/to/env/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this)) 

Jeśli wybierzesz tę trasę, zachować informacje o docs dać pamiętać:

to zmieni sys.path a nawet zmienić sys.prefix, ale również pozwalają korzystanie z istniejącego interpretator. Przedmioty z twojego środowiska będą wyświetlać się najpierw na sys.path, przed elementami globalnymi. Jednak globalne pozycje będą zawsze dostępne (tak jakby flaga --system-site-packages miała została użyta do stworzenia środowiska, bez względu na to, czy było, czy nie). Ponadto, nie może to cofnąć aktywacji innych środowisk lub modułów, które zostały zaimportowane w postaci . Nie powinieneś próbować, na przykład, aktywować środowiska przed żądaniem internetowym; należy aktywować jedno środowisko tak szybko, jak to możliwe, i nie robić tego ponownie w tym procesie.

0

Zmierzyłem się z tym samym problemem i zaproponowałem to rozwiązanie: https://github.com/jabbalaci/wpython. Jest to skrypt o nazwie "wpython", który wywołuje twój program za pomocą lokalnego interpretera Pythona w twoim venv. Dlatego zamiast "/Users/foo/environments/project/env/bin/python myscript.py" wystarczy napisać "wpython /path/to/myscript.py". Skrypt wyrzutnia może wyglądać następująco:

#!/usr/bin/env bash 

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

nie można po prostu dodać ścieżkę względną, a nie? To zadziałało dla mnie:

#!./env/bin/python 
0

W przypadku korzystania z systemu Windows, można dołączyć następujący wiersz w górnej części pliku Pythona.

#! P:\Workspace\pythontut\Scripts python 
Powiązane problemy