Como usar um virtualenv python com sudo?

44

Estou tentando separar um ambiente python do sistema (usando virtualenv) em um diretório que não esteja em / home, porque preciso usá-lo para criar outro software que precise ser acessível a vários usuários. Eu posso criar e ativar o virtualenv tudo bem, mas quando eu sudo algum comando (por exemplo para fazer ou compilar outro software), é o python do sistema que é usado (eu 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 ao sudo para usar um virtualenv? Ou talvez esta não seja a abordagem correta, e eu deveria fazer uma instalação completamente nova em python?

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

    
por Marco P. 31.12.2012 / 20:13

3 respostas

53

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

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

    
por Ken Kinder 22.01.2013 / 00:46
4

Apenas deparei com isso e para outros que podem encontrar o mesmo problema, Ken está correto que as variáveis env não estão sendo transportadas. A solução que usei foi adicionar as seguintes linhas ao meu script. Isso traz a vantagem de sempre carregar o ambiente virtual diretamente do script. (Significa que você pode usar o script com crontab ou launchd sem outras soluções alternativas.)

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: link

    
por corey_s 17.06.2015 / 02:43
4

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

    
por steveayre 07.03.2017 / 09:36

Tags