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


47

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

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

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


1
以下は機能しますか?sudo $(which python)<script>
John Drinane

回答:


57

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

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


3
スクリプトの最初の行で、virtualenvのPythonバイナリを指すようにすることもできます。#!<virtualenv_dir>/bin/python
OrangeTux

うーん、これはこれまでのところ唯一の解決策であることに迷惑です。Macでは、sudo pythonは仮想環境のpythonを使用します。
ゲーファン

4

偶然これに出くわし、同じ問題を発見するかもしれない他の人にとって、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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.