Ubuntu + virtualenv =混乱? virtualenvはdist-packagesを嫌い、site-packagesを望んでいます
-
06-07-2019 - |
質問
誰かが、ubuntu 9.04でpythonで何が起こっているのか説明してもらえますか?
virtualenv
を起動しようとしていますが、-no-site-packages
フラグはubuntuでは何もしないようです。 easy_install
( setuptools 0.6c9
にアップグレード)で virtualenv 1.3.3
をインストールしましたが、すべてがにインストールされているようです/usr/local/lib/python2.6/dist-packages
私は、apt-getを使用してパッケージをインストールすると、 /usr/lib/python2.6/dist-packages /
に配置されると仮定しますか?
問題は、 /usr/local/lib/python2.6/site-packages
が存在するだけでなく、空のままになっていることです。 ( virtualenv
の path
を見ると)これは、virtualenvがバックアップとして使用するフォルダーのようです。したがって、-no-site-packages
を省略したと思っても、virtualenvのいずれからもローカルシステムパッケージにアクセスできません。
だから私の質問は:
-
virtualenv
がdist-packages
の1つを指すようにするにはどうすればよいですか? - どの dist-packagesを指すべきですか?
/usr/lib/python2.6/dist-packages
または/usr/local/lib/python2.6/dist-packages /
-
/usr/lib/python2.6/site-packages
のポイントは何ですか?そこには何もありません! - パス上で先着順ですか?
/usr/local/lib/python2.6/dist-packages /
に新しいバージョンのパッケージXYZをインストールし、の古いバージョン(ubuntu repos / apt-getから)をインストールした場合/usr/lib/python2.6/dist-packages
、import xyz
をインポートするとどのファイルがインポートされますか?これはパスリストに基づいていると思いますか? - なぜこれが非常に混乱しているのですか?ここに足りないものはありますか?
-
easy_install
を/usr/local/lib/python2.6/dist-packages
にインストールすることはどこで定義されていますか? - これは
pip
にも影響しますか?
これを解決できる人に感謝します!
解決
site-packagesをdist-packagesへのリンクにすることでハッキングしたいと思いますが、ubuntu dist以外の拡張機能をインストールする他のケースに影響を与える可能性があります。 virtualenvのソースを調整する以外は、1に対する別の答えは考えられません(ubuntuとvirtualenvの両方が非常に人気があるので、調整されたバージョンがすでに存在することに驚かないでしょう)。
Re 2、/ usr / local / bin / pythonを使用している場合は、/ usr / localバージョンのlib(サイトパッケージを含む)を使用し、逆に/ usr / bin / pythonを使用している場合。
再3、ソースから(easy_installまたはubuntuのディストリビューションからではなく)/ usr / bin / pythonの拡張機能をインストールした場合、そこに何かがあります。
再4、はい、パス上の以前のエントリが優先されます。
Re 5、easy_installはその名前だけで簡単です-私たちのpythonコミッターの間のコンセンサスは利便性のための深い暗い魔法であるため、その便利さにもかかわらず標準のpythonライブラリから慎重に除外されているほど多くの暗い魔法をします「簡単」表面のみ。
再6、それはeasy_installに対するubuntuの修正だと思います-そうであれば、Canonicalや他のubuntuのメンテナーが集合的な決定をする場所ならどこでも定義されます。
再7、申し訳ありませんが、わからない-確認できる最新のUbuntuが手元にありません。
他のヒント
virtual-envメーリングリストが最高のようです。 OPが両方の場所でこの質問を公開していることに注意してください。
メールのオリジナルコンテンツ:
Debianは/ usr / local / lib / pythonVERSION / site-packagesを作成し、 Pythonバイナリをコンパイルしてデフォルトの検索に含める パス。 Ubuntuは通常どおりDebianのリードに従いました。 Python 開発者はこれを好まなかった 同じサイトパッケージを使用してローカルにインストールされた/ usr / local / bin / python ディレクトリ。 Ubuntuはついにサイトパッケージを放棄して使用することを決定しました 代わりにdist-packages、彼らが発明した名前なので、 何かに干渉します。ローイングストーリーはどこかにあります あなたはそれをグーグル、Pythonバグトラッカーまたはdistutils SIGのどこかで など。
少なくともUbuntuのvirtualenvパッケージを使用している場合、システムは動作します。 一部の人々は、ローカルにインストールされたvirtualenvの使用で問題を抱えています Ubuntuは、魔法のsys.pathエントリが追加されていなかったため、または 何か。 --no-site-packagesがわからない そのオプション:私はUbuntuパッケージからPILとmysqldbを実行します Cの依存関係をコンパイルするのが難しい場合があります。 (必要 右ヘッダーファイル、Pythonはヘッダーファイルなどを無視しています)
Ubuntu Pythonパッケージは / usr / lib / pythonVERSION / dist-packages。またはそのPythonサポート 何らかの理由でディレクトリ。ローカルにインストールされたPythonパッケージは デフォルトでは/ usr / local / lib / pythonVERSION / dist-packages。いつでも 実行するUbuntu 9.04システムをインストールします。
$ sudo apt-get install python-setuptools(6.0c9) $ sudo apt-get install python-virtualenv(1.3.3) $ sudo easy_install pip $ sudo pip install virtualenvwrapper
virtualenvはこの方法で正常に機能しますが、-no-site-packagesを試したことはありません。
virtualenvと--no-site-packagesフラグを起動しようとしています Ubuntuでは何もしないようです。 virtualenv 1.3.3をインストールしました easy_install(setuptools 0.6c9にアップグレードしました)
これらのバージョンはどちらもUbuntu 9.04に含まれているため、より難しくしています 自分でローカルにインストールしてください。
およびすべて /usr/local/lib/python2.6/dist-packagesにインストールされているようです
はい
apt-getを使用してパッケージをインストールする場合、/に配置されると仮定します usr / lib / python2.6 / dist-packages /?
はい
- パス上で先着順ですか?新しい人がいる場合 /usr/local/lib/python2.6/dist-にインストールされているパッケージXYZのバージョン packages /および/ usr / lib /内の古い(ubuntu repos / apt-getから) python2.6 / dist-packages、xyzをインポートするとどれがインポートされますか? これはパスリストに基づいていると思いますか?
sys.pathは順番にスキャンされます。唯一面白いのは、.pthの卵 一部の人々が予想するよりも先に、または後でパスに入れます。しかし、もし あなたはそれができることすべてにピップを使用しています(つまり、ピップをインストールすることを除いて 自体、プリコンパイルされた卵、およびローカルディレクトリのスナップショット 卵リンクではなくコピー)、とにかく多くの.pth卵はありません。
- なぜこれが非常に混乱しているのですか?私は何かありますか ここにありませんか?
十分に文書化されていません。私はウェブをスキャンしてそれを見つけました。
- これはpipにも影響しますか?
はい、pipは自動的にインストールされます / usr / local / lib / pythonVERSION / site-packages。 " pip install -Eを使用します $ VIRTUAL_ENVパッケージ名" virtualenvにインストールします。
システム管理ツールを構築する場合、または新しいシステムサービスと見なされるものを構築する場合を除き、UbuntuのPythonインストールに実際に触れてはいけません。
Ubuntuを使用してPythonアプリケーションを開発またはデプロイする場合は、常にソースから独自のPythonをビルドし、tarを作成して、デプロイメントに使用します。これにより、すべてのディレクトリが適切な場所に配置され、virtualenvが正常に機能します。サーバーに複数のPythonアプリをデプロイする場合は、Pythonを / home / python
や / opt / python
などの場所、またはホームディレクトリの外部に配置します。 。開発者グループ( users
?)の書き込み権限があることを確認して、人々が簡単にパッケージを追加できるようにします。
これにより、2層のパッケージを作成することもできます。社内標準ツールであるものはPythonディストリビューションにインストールして、展開するtarballの一部にすることができ、アプリ固有のパッケージのみがvirtualenvに含まれます。
PythonをインストールしたUbuntuシステムをアップグレードまたは変更しないでください。
まあ、Ubuntu 9.04を持っているので、すぐにサイトパッケージとそうでないものの2つのサンドボックスをセットアップしてみました。そして、物事はうまく機能しています。
私が取ったアプローチの唯一の違いは、Ubuntuのpython-virtualenvパッケージ(1.3.3)を使用したことです。また、Ubuntuのセットアップに合わせてUbuntuチームによって調整されていると仮定します。
しばらくの間、easy_installed virtualenvを無効にすることを要約するには、パッケージ化されたpython-virtualenv を使用して、期待どおりかどうかを確認します。
実際、問題なく本番用に同様のセットアップを使用しています。残りはすでにアレックスによって回答されています。
別の修正方法:
https://stackoverflow.com/a/17265840/202168
各virtualenvで必要な場所でそれを行うことを忘れないでくださいが、ハッキングやvirtualenvの特別なバージョンに依存しません