virtualenv --no-site-packagesとpipはまだグローバルパッケージを探していますか?


136

私はvirtualenv --no-site-packages完全に分離した孤立したPython環境を作成するという印象を受けましたが、そうではありません。

たとえば、python-djangoをグローバルにインストールしていますが、Djangoの異なるバージョンでvirtualenvを作成したいと考えています。

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ pip -E foo install Django
Requirement already satisfied: Django in /usr/share/pyshared
Installing collected packages: Django
Successfully installed Django

私が知ることができることから、pip -E foo install上記はDjangoの新しいバージョンを再インストールすることになっています。また、pipに環境をフリーズするように指示すると、大量のパッケージが取得されます。--no-site-packagesこれで新鮮な環境が空白になると思いますか?

$ pip -E foo freeze
4Suite-XML==1.0.2
BeautifulSoup==3.1.0.1
Brlapi==0.5.3
BzrTools==1.17.0
Django==1.1
... and so on ...

私はどのように機能する--no-site-packagesことになっているのか誤解していますか?


4
参考までに、-no-site-packagesは非推奨になりました。こちらをご覧ください
セーラムベンマブローク

@SalemBenMabroukリンク切れ、新しいリンクはここ。Githubの関連問題:'--no-site-packages'フラグは最近消えましたか?
Ynjxsjmh

そのリンクでは、それ--no-site-packagesは廃止されたと言います。下位互換性のためにのみ保持されます。グローバルサイトパッケージにアクセスできないことがデフォルトの動作になりました。グローバルサイトパッケージにアクセスする場合は、を有効にすることができ--system-site-packagesます。
Ynjxsjmh

回答:


107

(virtualenvを発見するずっと前に).bashrcファイルのPYTHONPATHにディレクトリを追加することに気づくまで、私はこのような問題を抱えていました。1年以上前だったので、すぐには思いつきませんでした。


12
私のヒーロー!これが問題であるかどうかをすぐに確認したい場合は、printenvを実行してPYTHONPATHが存在するかどうかを確認し、存在する場合はunset PYTHONPATHを実行します。問題がポップアップしないようにするには、問題を追跡する必要がありますが、現在のシェルセッションで新しいvirtualenvを設定できます。
UltraBob

自作もこれを行います!
ロブ

1
私はあなたにもっと賛成できるといいのですが。PYTHONPATHが既に設定されているために発生した問題に遭遇した後、このページに何度もアクセスしました。
Bemmu 2015

私はこれが本当に(本当に)古い投稿であることを知っていますが、SOで自分自身の質問をすることも含め、あらゆる場所を検索してきました--no-site-packages。私はubuntuをワイプするだけで近づいてきて、それで問題が解決するかどうかを確認しています。最初は同じPYTHONPATHの問題が発生しているprintenvと思っていましたが、を実行すると、表示されません。欲求不満が高まっているし、どんな助けも大歓迎です。で作成されたvenv内からのsys.path --no-site-packagesには、すべてのパッケージディレクトリが含まれているようです。私はこれを変更する方法を最も曇っていません。助けて?
NotAnAmbiTurner 2015年

これはPATH、virtualenvの外部から実行可能ファイルを見つける場合にも、グローバル変数に適用できます。
エンダーランド

27

pipグローバルではなく、作成した仮想環境でバイナリを実行していることを確認する必要があります。

env/bin/pip freeze

テストを見る:

--no-site-packagesオプションでvirtualenvを作成します:

$ virtualenv --no-site-packages -p /usr/local/bin/python mytest
Running virtualenv with interpreter /usr/local/bin/python
New python executable in mytest/bin/python
Installing setuptools, pip, wheel...done.

freeze新しく作成したの出力を確認しますpip

$ mytest/bin/pip freeze
argparse==1.3.0
wheel==0.24.0

しかし、グローバルを使用するとpip、次のようになります。

$ pip freeze
...
pyxdg==0.25
...
range==1.0.0
...
virtualenv==13.1.2

つまり、pipシステム全体にインストールされているすべてのパッケージです。チェックするwhich pipことで、(少なくとも私の場合は)のようなものが得られます。/usr/local/bin/pipつまり、これを行うpip freezeと、の代わりにこのバイナリが呼び出されmytest/bin/pipます。


私も同じ問題を抱えていました。最初にpip freezeを呼び出すと正しいパッケージが表示されたので、どうしてそれが起こったのかと思いますが、数日後に/ usr / local / bin /にあるパッケージを呼び出し始めました...
jimijazz

1
これが私にとっての問題でしpipた。virtualenvをアクティブ化するときにオーバーライドされなかったグローバルpipへの特定のパスにエイリアスを設定していました。
merlinND 2017

1
あなたは私を救っただけです、これは私(pip3&python3.7)にうまくいきましたありがとう
Saed Yousef

24

結局、何らかの理由で、pip -Eが機能していなかったことがわかりました。ただし、virtualenvを実際にアクティブ化し、virtualenvによって提供されるeasy_installを使用してpipをインストールしてから、pipを直接使用すると、期待どおりに動作し、virtualenv内のパッケージのみが表示されます


2
FWIW、pipとvirtualenvの現在のトランクバージョンを使用すると、元のワークフローは、とにかく私にとって正しいことを行います。とは言っても、私は個人的に-Eを避け、各virtualenvにpipをインストールするだけです。
カールマイヤー

17

私はこれが非常に古い質問であることを知っていますが、ここに到着して解決策を探している人のために:

実行する前にvirtualenvsource bin/activate)をアクティブにすることを忘れないでくださいpip freeze。それ以外の場合は、すべてのグローバルパッケージのリストが表示されます。


どうもありがとうございました。virtualenvwrapperではなく、virtualenvでソースを使用する必要があることはわかっていました。pipがフリーズすることは聞いたことがありません。再びありがとう
Deepend

正解。virtualenvを初期化した後、それをアクティブにする必要があります。そうしないと、Pythonのシステムバージョンを使用することになります
AsAP_Sherb

16

以下を一時的にクリアPYTHONPATHします:

export PYTHONPATH=

次に、仮想環境を作成してアクティブ化します。

virtualenv foo
. foo/bin/activate

その後のみ:

pip freeze

15

--no-site-packages名前からわかるように、から標準のsite-packagesディレクトリを削除する必要がありますsys.path。標準のPythonパスに存在するその他のものはそのまま残ります。


1
私の掃除のためPYTHONPATHexport PYTHONPATH=トリックを行うように見えました。
ジュニパー

4

script.pyWindowsのデフォルトのオープナーを使用し、仮想環境外でPythonを開くスクリプトを直接呼び出すと、Windowsで同様の問題が発生する可能性があります。で呼び出すpython script.pyと、仮想環境でPythonが使用されます。


スクリプトの最上部にシバン行( '!#'で始まる)が必要です。これは、使用されるインタープリターを示します。
wobbily_col

2

これは、virtualenvディレクトリを別のディレクトリ(Linux上)に移動したり、親ディレクトリの名前を変更したりした場合にも発生するようです。


1

私も同じ問題を抱えていました。私(Ubuntu)の問題は、パス名にが含まれていること$でした。$ dirの外にvirtualenvを作成したとき、それはうまくいきました。

変だ。


1

virtualenv pipが機能しない原因として考えられるのは、親フォルダーの名前にスペースがあり、名前を/Documents/project name/app 変更して/Documents/projectName/app問題を解決した場合です。


1

私はvenvのpipがまだグローバルpipとして機能するのと同じ問題に遭遇しました。
多くのページを検索した後、私はこのようにそれを理解します。
1.オプション「--no-site-packages」を使用してvirtualenvで新しいvenvを作成します

virtualenv --no-site-packages --python=/xx/xx/bin/python my_env_nmae

「--no-site-packages」オプションは、virtualenvのdocファイルで1.7.0以降デフォルトでtrueでしたが、手動で設定しないと機能しないことに注意してください。純粋なvenvを取得するには、このオプションをオンにすることを強くお勧めします。2。作成した新しい環境をアクティブ化します

source ./my_env_name/bin/activate
  1. PIPの場所とPythonの場所を確認し、これら2つのコマンドが仮想環境下にあることを確認してください
pip --version
which python
  1. 仮想環境でpipを使用して、グローバルパッケージの中断から解放されたパッケージをインストールします
pip install package_name

この回答がお役に立てば幸いです。


0

ここにすべてのpipインストールオプションのリストがあります -' -E'オプションが見つかりませんでした。古いバージョンにそれがあった可能性があります。以下では、プレーンな英語の使用法とvirtualenv今後のSOユーザーのための作業について説明します。


すべてが問題ないようです。virtualenvfoo)のアクティブ化を受け入れます。それが行うすべては、複数の(そして変化する)Python環境、つまりさまざまなPythonバージョン、さまざまなDjangoバージョン、またはその他のPythonパッケージを使用できるようにすることです-本番環境に以前のバージョンがあり、最新のDjangoリリースを応用。

つまり、仮想環境(virtualenv)の作成と使用()により、異なるPythonインタープリター、つまりPython 2.7と3.3を使用してアプリケーションまたは単純なpythonスクリプトを実行またはテストできます-新規インストール(--no-site-packagesオプションを使用)または既存のすべてのパッケージ/最後のセットアップ(--system-site-packagesオプションを使用)。これを使用するには、アクティブ化する必要があります。

$ pip install djangoグローバルサイトパッケージにインストールし、同様にを取得するpip freezeと、グローバルサイトパッケージの名前が表示されます。

venv dir(foo)内で実行する$ source /bin/activateとvenvがアクティブになります。つまり、pipでインストールされたものはすべて仮想envにのみインストールされ、pipフリーズではグローバルサイトパッケージのPythonパッケージのリストが表示されなくなります。有効化されると:

$ virtualenv --no-site-packages foo       
New python executable in foo/bin/python
Installing setuptools............done.
$ cd foo
$ source bin/activate 
(foo)$ pip install django

(foo)$兆候が表示される前に、仮想Python環境を使用していることを示します。つまり、pipを使用するものはすべて、このvenvに限定され、グローバル/デフォルトのPythonインストール/パッケージには影響しません。

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