14

誰かがubuntu 9.04でpythonで何が起こっているのか説明してもらえますか?

スピンアップしようとしていますがvirtualenv--no-site-packagesフラグはubuntuでは何もしていないようです。私は(にアップグレードしました)でインストールvirtualenv 1.3.3しましたが、すべてがにインストールされているようですeasy_installsetuptools 0.6c9/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 からもローカル システム パッケージにアクセスできません。

だから私の質問は:

  1. virtualenvのいずれかを指すにはどうすればよいdist-packagesですか?
  2. どのdist-packagesを指す必要がありますか? /usr/lib/python2.6/dist-packagesまた/usr/local/lib/python2.6/dist-packages/
  3. のポイントは/usr/lib/python2.6/site-packages何ですか?そこには何もありません!
  4. パスは先着順ですか?パッケージ XYZ の新しいバージョンが にインストールされていて/usr/local/lib/python2.6/dist-packages/、(ubuntu repos/apt-get から) に古いバージョンがインストールされている場合、次の/usr/lib/python2.6/dist-packagesときにどちらがインポートされimport xyzますか? これはパスリストに基づいていると思いますよね?
  5. 一体、なぜこれほど紛らわしいのでしょうか?私がここに欠けているものはありますか?
  6. easy_installインストール先はどこに定義されてい/usr/local/lib/python2.6/dist-packagesますか?
  7. これも影響pipしますか?

これをクリアできる人に感謝します!

4

5 に答える 5

17

virtual-envメーリングリストからのMike Orrの回答が最良のようです。OPがこの質問を両方の場所で公開したことに注意してください。

メールの元の内容:

数年前、Debian は /usr/local/lib/pythonVERSION/site-packages を作成し、Python バイナリをコンパイルしてデフォルトの検索パスに含めました。Ubuntu は、通常どおり Debian のリードに従いました。同じサイト パッケージ ディレクトリを使用して、ローカルにインストールされた /usr/local/bin/python に干渉するため、Python 開発者はこれを好みませんでした。Ubuntu は最終的に site-packages を放棄し、代わりに dist-packages を使用することを決定しました。これは、何にも干渉しないように彼らが考案した名前です。グーグルで検索すると、Python バグ トラッカーや distutils SIG などのどこかに、その話があります。

少なくとも Ubuntu virtualenv パッケージを使用している場合、システムは機能します。魔法の sys.path エントリが追加されていないなどの理由で、Ubuntu でローカルにインストールされた virtualenv を使用する際に問題が発生した人もいます。--no-site-packages については、そのオプションを使用したことがないため、よくわかりません。C の依存関係をコンパイルするのが難しい場合があるため、Ubuntu パッケージから PIL と mysqldb を実行します。(適切なヘッダー ファイルが必要です。Python はヘッダー ファイルを無視しています。)

したがって、Ubuntu Python パッケージは /usr/lib/pythonVERSION/dist-packages に入ります。または、何らかの理由でその python-support ディレクトリ。ローカルにインストールされた 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

--no-site-packages は試していませんが、virtualenv はこの方法で問題なく動作します。

virtualenv をスピンアップしようとしていますが、--no-site-packages フラグは ubuntu では何もしないようです。easy_install で virtualenv 1.3.3 をインストールしました (setuptools 0.6c9 にアップグレードしました)。

これらのバージョンはどちらも Ubuntu 9.04 に含まれているため、ローカルにインストールすることで自分自身を難しくしています。

すべてが /usr/local/lib/python2.6/dist-packages にインストールされているようです

はい

apt-get を使用してパッケージをインストールすると、 /usr/lib/python2.6/dist-packages/ に配置されると思いますか?

はい

  1. パスは先着順ですか?パッケージ XYZ の新しいバージョンが /usr/local/lib/python2.6/dist-packages/ にインストールされていて、古いバージョン (ubuntu repos/apt-get から) が /usr/lib/ python2.6/dist にインストールされている場合- パッケージ、xyz をインポートするとどのパッケージがインポートされますか? これはパスリストに基づいていると思いますよね?

sys.path は順番にスキャンされます。唯一の面白い点は、.pth の卵が、一部の人々が予想するよりも早くまたは遅くパスに配置されることです。しかし、できることすべてに pip を使用している場合 (つまり、pip 自体、プリコンパイル済みの卵、および卵のリンクではなくコピーであるローカル ディレクトリのスナップショットをインストールすることを除く)、とにかく多くの .pth の卵はありません。 .

  1. 一体、なぜこれほど紛らわしいのでしょうか?私がここに欠けているものはありますか?

それは十分に文書化されていません。ウェブをスキャンしてそれを理解しました。

  1. これはピップにも影響しますか?

はい、pip は自動的に /usr/local/lib/pythonVERSION/site-packages にインストールされます。"pip install -E $VIRTUAL_ENV packagename" を使用して virtualenv にインストールします。

于 2009-10-13T03:09:20.230 に答える
9

site-packages を dist-packages へのリンクにすることでハッキングしたくなりますが、これは、ubuntu dist 以外の拡張機能をインストールする他のケースに影響を与える可能性があると思います。virtualenvのソースを微調整する以外に、1に対する別の答えは考えられません(ubuntuとvirtualenvの両方が非常に人気があるため、微調整されたバージョンが既に存在することに驚かないでしょう)。

Re 2、/usr/local/bin/python を使用している場合は、lib の /usr/local バージョン (site-packages を含む) を使用し、/usr/bin/python を使用している場合は逆に使用する必要があります。

Re 3 では、ソースから (easy_install や ubuntu のディストリビューションではなく) /usr/bin/python の拡張機能をインストールすると、そこに何かが表示されます。

Re 4、はい、パスの以前のエントリが優先されます。

Re 5 では、easy_install はその名前だけで簡単です。非常に多くのダーク マジックを実行するため、その利便性にもかかわらず、標準の python ライブラリから慎重に除外されてきました。これは、Python コミッター間のコンセンサスが、利便性のためのディープ ダーク マジックは「簡単」であるということです。表面だけ。

Re 6、これは easy_install に対する ubuntu の変更だと思います。それが正しければ、Canonical または他の ubuntu メンテナーが集合的な決定を下す場所で定義されます。

Re 7、申し訳ありませんが、わかりません-チェックする合理的な最近のubuntuが手元にありません。

于 2009-08-01T01:52:29.060 に答える
4

システム管理ツールを構築している場合や、新しいシステム サービスと見なされるものを構築している場合を除き、Ubuntu の Python インストールには触れないでください。

Ubuntu を使用して Python アプリケーションを開発またはデプロイする場合は、常にソースから独自の Python をビルドし、それを tar して、それをデプロイに使用してください。そうすれば、すべてのディレクトリが適切な場所に配置され、virtualenv が正常に機能します。サーバーに複数の Python アプリをデプロイする場合は、Python をホーム ディレクトリのような場所/home/pythonまたは/opt/python外部の場所に配置します。users人々がパッケージを簡単に追加できるように、開発者グループ ( ?) に対する書き込み権限があることを確認してください。

これにより、パッケージを 2 層にすることもできます。社内の標準ツールは、Python ディストリビューションにインストールして、展開する tarball の一部にすることができ、アプリ固有のパッケージのみが virtualenv に含まれます。

Python がインストールされている Ubuntu システムをアップグレードまたは変更しないでください。

于 2011-08-02T22:51:51.153 に答える
2

さて、私はUbuntu 9.04を持っていて、サイトパッケージを含むサンドボックスと含まないサンドボックスをすぐにセットアップしようとしました。そして、物事はうまくいっています。

私が採用したアプローチの唯一の違いは、Ubuntu の python-virtualenv パッケージ (1.3.3) を使用したことです。そして、Ubuntu のセットアップに合わせて Ubuntu チームによって微調整されていると仮定します。

easy_installed virtualenv をしばらく無効にすることをまとめると、パッケージ化された python-virtualenvを使用して、それが期待どおりかどうかを確認します。

実際、本番環境でも同様のセットアップを問題なく使用しています。残りはすでにアレックスによって回答されています。

于 2009-08-01T07:50:26.583 に答える