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 sudo
comando 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 sudo
para 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).
Respostas:
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á executarsudo ./AwesomeProject/bin/python <script>
para usar o script com o virtualenv com privilégios de root.fonte
#!<virtualenv_dir>/bin/python
.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.)
Mais informações aqui: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python
fonte
À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"
fonte