Como usar um python virtualenv com o sudo?

47

Estou tentando tornar um ambiente python separado do sistema (usando virtualenv) em um diretório que não esteja em / home, porque preciso usá-lo para criar outro software que possa ser acessível a vários usuários. Posso criar e ativar o virtualenv, mas quando sudocomando algum (por exemplo, para criar ou compilar outro software), é o python do sistema que é usado (posso dizer por causa dos módulos disponíveis).

Como no Ubuntu não é bom usar o usuário root , existe uma maneira de dizer sudopara usar um virtualenv? Ou talvez essa não seja a abordagem correta, e eu deva fazer uma instalação python completamente nova?

Estou usando a versão de 64 bits do Ubuntu 12.04 (e python 2.7).

Marco P.
fonte
11
O seguinte funciona? sudo $ (que python) <script>
John Drinane

Respostas:

57

O problema é quase certo que quando você executa sudo, as variáveis ​​de ambiente virtualenv, aliases, funções etc. não estão sendo transferidas.

A solução seria executar explicitamente o executável Python do ambiente virtual sudo. Por exemplo, se seu virtualenv for ./AwesomeProject, você poderá executar sudo ./AwesomeProject/bin/python <script>para usar o script com o virtualenv com privilégios de root.

Ken Kinder
fonte
3
Você também pode deixar a primeira linha do seu script apontar para o binário Python no seu virtualenv. #!<virtualenv_dir>/bin/python.
OrangeTux 17/09/2013
Ugh, irritante que esta seja a única solução até agora. No Mac, o sudo python usa python do ambiente virtual.
gaefan
4

Apenas deparei com isso e, para outros que possam encontrar o mesmo problema, Ken está certo de que as variáveis ​​env não estão sendo transferidas. A solução que usei foi adicionar as seguintes linhas ao meu script. Isso tem o benefício adicional de sempre carregar o ambiente virtual diretamente do script. (Isso significa que você pode usar o script com crontab ou launchd sem nenhuma outra solução alternativa.)

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))

Mais informações aqui: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
fonte
4

Às vezes, você precisa do $ PATH atualizado porque o script executa outros programas. Por exemplo, o pypi-install precisa de py2dsc-deb no PATH. Este comando funciona:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

steveayre
fonte