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ę sudo
jakieś 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ć, sudo
aby 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).
Odpowiedzi:
Problem jest prawie na pewno taki, że po uruchomieniu
sudo
zmienne ś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.źródło
#!<virtualenv_dir>/bin/python
.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ść).
Więcej informacji tutaj: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python
źródło
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"
źródło