web-dev-qa-db-ja.com

sudoでpython virtualenvを使用するには?

/ homeの下にないディレクトリに_virtualenvを使用してシステム環境とは別にpython環境を作成しようとしていますが、複数の環境にアクセスできる他のソフトウェアを構築する必要があるためユーザー。私はvirtualenvを作成してアクティブにすることができますが、Sudo何らかのコマンド(他のソフトウェアを作成またはコンパイルするなど)の場合、使用されるのはシステムpythonです利用可能なモジュールの)。

Ubuntuではrootユーザーを使用するのは良いことではないので、Sudoにvirtualenvを使用するように指示する方法はありますか?または、これは正しいアプローチではなく、完全に新しいpythonインストールを行う必要がありますか?

64ビットバージョンのUbuntu 12.04(およびpython 2.7)を使用しています。

45
Marco P.

問題は、ほぼ確実にSudoを実行すると、virtualenv環境変数、エイリアス、関数などが引き継がれないことです。

解決策は、Sudoを使用して仮想環境のPython実行可能ファイルを明示的に実行することです。たとえば、virtualenvが./AwesomeProjectの場合、Sudo ./AwesomeProject/bin/python <script>を実行して、root権限でvirtualenvでスクリプトを使用できます。

55
Ken Kinder

スクリプトが他のプログラムを実行するため、$ PATHを更新する必要がある場合があります。たとえば、pypi-installにはPATHにpy2dsc-debが必要です。このコマンドは機能します:Sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

4
steveayre

これに偶然出会っただけで、同じ問題を発見するかもしれない他の人にとっては、Kenはenv変数が引き継がれていないことは正しいです。私が使用した解決策は、スクリプトに次の行を追加することでした。これには、常にスクリプトから仮想環境を直接ロードするという追加の利点があります。 (つまり、crontabでスクリプトを使用するか、他の回避策なしでlaunchdを使用できます。)

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

詳細な背景: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

4
corey_s