virtualenvにグローバルサイトパッケージから特定のパッケージを継承させる


208

私は、ベースのPythonインストールのいくつかのライブラリ(私が選択したもの)のみを含むvirtualenvを作成する方法を探しています。

具体的には、virtualenvの作成中にmatplotlibをvirtualenvにインポートしようとしています。一部のfortranコンパイラー・ライブラリーが欠落しているため、pipまたはeasy_installでは効率的にインストールできません。今まで私がやった方法は、手動でコピーすることでした

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

ただし、これにより、手動でインポートされたリンクがyolkによって登録されなくなります(virtualenvで現在使用可能なすべてのライブラリが出力されます)。

だから、の選択的なバリアントを行う方法はありますか

virtualenv --system-site-packages

16
穏やかなリマインダー-以下のいずれかが機能するように見える場合は、回答を選択してください。
foob​​arbecue 2013

1
過去数か月間に12人があなたのためにテストしたようです...
foob​​arbecue 2014年

2
なぜOPを困らせるのですか?どれが最も人気のある答えであるかは誰でもわかるでしょう。彼がそれを受け入れるかどうかは本当に重要ですか?私は、最も人気のある答えを単にチェックするのではなく、彼自身のテストにおける誠実さを賞賛すべきだと思います。
Michael Scheper 16年

5
2013:正解と不正解の回答スコアはかなり似ています。OPは彼がテストすると言います。2016:Michael Scheperは非常に感銘を受け、OP(3年前)はテストを行うと述べました。2017:私はこの質問に再び遭遇し、面白がっています。
foob​​arbecue 2017年

2
正解はありません。OPは選択を求めた--system-site-packages。Answersは、非選択的な--system-site-packagesパッケージを使用して、一部のパッケージをローカルでオーバーインストールすることを提案しています。
Piotr Jurkiewicz

回答:


238

で環境を作成しますvirtualenv --system-site-packages。次に、virtualenvをアクティブ化し、システムpythonではなくvirtualenvにインストールする場合は、pip install --ignore-installedまたはを使用しますpip install -I。これにより、システム全体のバージョンが存在していても、pipはローカルで要求したものをインストールします。Pythonインタープリターはvirtualenvのパッケージディレクトリを最初に検索するため、これらのパッケージはグローバルパッケージをシャドウする必要があります。


45
-Iを使用すると、パッケージがシステム全体のサイトパッケージディレクトリにすでに存在する場合でも、常にパッケージを再インストールします。代わりに-Uを使用すると、virtualenvに新しいバージョンのパッケージがインストールされますが、必要なバージョンのシステムですでに利用可能なパッケージは再インストールされません。
Danilo Bargen

15
以前に作成した仮想環境で--system-site-packagesオプションを「アクティブ化」する方法があるかどうかを知っていますか?すべてのローカルパッケージを再インストールする手間を省きたいです。
ガブリエル


この回答は非常に興味深いものでしたが、うまくいかない非常に奇妙なケースがありました。virtualenvがno-global-site-packages有効になっています。しかし、何らかの理由で、グローバルシステムから使用されていたパッケージがあったことを知りません。pip install -Ivirtualenv内からパッケージに使用しても機能しませんでした。最終的に、virtualenvとグローバルシステムの両方からパッケージを一時的にアンインストールすることになり、virtualenvとシステムに(この順序で)インストールできるようになりました。これで問題なく動作します。
kstenger、2015

3
-1質問は、シャドウされたパッケージを除いてすべてではなく、特定のパッケージを表示することを求めています。制限付きセットをホワイトリストに登録することは、すべてをホワイトリストに登録するよりもはるかに安全です。これにより、明示的にホワイトリストに登録されたものを除くすべてのパッケージがvenvに存在する必要があることが保証されます。
bluenote10 2018年

19

を使用して--system-site-packages、virtualenvの特定のものを「上書きインストール」できます。そうすれば、virtualenvにインストールしたものはすべてそこから取得され、それ以外の場合はシステムから取得されます。


何が不明確なのか正確にはわかりませんが、試してみます:--system-site-packagesオプションを使用してvirtualenvを作成すると、システムはまずvirtualenvでパッケージを見つけようとしますが、見つからない場合は、システムのpythonインストールでそれを見つけてください。そこにも見つからない場合にのみ、ImportErrorが発生します。
schacki 2013年

4
このアプローチの唯一の問題は、現在すべてのシステムライブラリがあることです。インストールされているものを非常に厳密に制御したい場合。
ドウェイン2013年

7
はっきりしないのは、これが実際にどのように可能であるかです。システムにmyprogが存在する--system-site-packagesで作成されたvirtualenvにmyprogをpip installした場合、myprogは「上書き」されません。myprogが存在することがわかり、「要件はすでに満たされています」と表示されます。だから…どういう意味?
foob​​arbecue 2013年


-7

使用できますvirtualenv --clear。これはパッケージをインストールしないため、必要なパッケージをインストールします。


これは、システム全体のパッケージを使用する方法に関する実際の質問に対する回答ではありません
MrLeeh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.