Jak korzystać z Pythona virtualenv z sudo?

47

Usiłuję oddzielić środowisko python od systemu (przy użyciu virtualenv) w katalogu, który nie znajduje się w katalogu / home, ponieważ muszę go użyć do zbudowania innego oprogramowania, które musi być dostępne dla wielu użytkowników. Mogę stworzyć i aktywować virtualenv w porządku, ale kiedy wykonuję sudojakieś polecenie (na przykład, aby stworzyć lub skompilować inne oprogramowanie), to jest używany python systemowy (mogę to stwierdzić z powodu dostępnych modułów).

Ponieważ w systemie Ubuntu nie jest dobrze używać użytkownika root , czy istnieje sposób, aby powiedzieć, sudoaby używać virtualenv? A może to nie jest właściwe podejście i powinienem zrobić zupełnie nową instalację Pythona?

Używam 64-bitowej wersji Ubuntu 12.04 (i python 2.7).

Marco P.
źródło
1
Czy następujące działa? sudo $ (który python) <skrypt>
John Drinane

Odpowiedzi:

57

Problem jest prawie na pewno taki, że po uruchomieniu sudozmienne środowiskowe virtualenv, aliasy, funkcje itp. Nie są przenoszone.

Rozwiązaniem byłoby jawne uruchomienie pliku wykonywalnego Python środowiska wirtualnego sudo. Na przykład, jeśli twoja virtualenv to ./AwesomeProject, możesz uruchomić, sudo ./AwesomeProject/bin/python <script>aby użyć skryptu z virtualenv z uprawnieniami roota.

Ken Kinder
źródło
3
Możesz także pozwolić, aby pierwsza linia skryptu wskazywała na plik binarny Python w swoim virtualenv. #!<virtualenv_dir>/bin/python.
OrangeTux,
Ugh, denerwujące, że do tej pory jest to jedyne rozwiązanie. Na Macu sudo python używa Pythona z wirtualnej env.
gaefan
4

Natknąłem się na to i dla innych, którzy mogą znaleźć ten sam problem, Ken ma rację, że zmienne env nie są przenoszone. Rozwiązaniem, które zastosowałem, było dodanie następujących wierszy do mojego skryptu. Ma to tę dodatkową zaletę, że zawsze ładuje środowisko wirtualne bezpośrednio ze skryptu. (Oznacza to, że możesz używać skryptu z crontabem lub uruchamiać go bez żadnych innych obejść).

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

Więcej informacji tutaj: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
źródło
4

Czasami potrzebujesz zaktualizowanej zmiennej $ PATH, ponieważ skrypt uruchamia inne programy. Na przykład pypi-install wymaga py2dsc-deb w PATH. To polecenie działa:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

Steveayre
źródło