92

編集: Ulf Rompe のコメントに基づいて、"0" の代わりに "1" を使用することが重要です。そうしないと、sys.pathが壊れます。

私はかなり長い間 (1 年以上) python を実行してきましたがsys.path.append()sys.path.insert(). 実演させてください。

私は PyWorkbooks という名前のモジュール (私のコンピューターにインストールされています) に取り組んでいるとしましょうが、同時に PyWorkbooks を組み込んだ別のモジュール (PyJob としましょう) に取り組んでいます。PyJob に取り組んでいるときに、PyWorkbooks に修正中のエラーを見つけたので、開発版をインポートしたいと思います。

両方で作業する方法は複数ありますが (たとえば、PyWorkbooks プロジェクトを PyJob 内に配置することもできます)、それでもパスをいじる必要がある場合があります。ただし、PyWorkbooks があるフォルダーに簡単にアクセスすることはできませんsys.path.append()。なんで?python はインストール済みの PyWorkbooks を最初に見つけるからです!

これが、sys.path.insert(1, path_to_dev_pyworkbooks) を実行する必要がある理由です。

要約すれば:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

また:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

これにより、過去にいくつかのハングアップが発生しました。パスを手動で挿入しているかのように、(コミュニティとして) を推奨し始めsys.path.insert(1, path)たら、それがあなたが望むパスであると言っても安全だと思います。使用する!

または、何か問題がありますか?それは時々私を悩ませる質問であり、私はそれをオープンにしたかったのです!

4

3 に答える 3

50

本当に sys.path.insert を使用する必要がある場合は、sys.path[0] をそのままにしておくことを検討してください。

sys.path.insert(1, path_to_dev_pyworkbooks)

サードパーティのコードはsys.path ドキュメントの適合性に依存している可能性があるため、これは重要になる可能性があります。

プログラムの起動時に初期化されるため、このリストの最初の項目である path[0] は、Python インタープリターを呼び出すために使用されたスクリプトを含むディレクトリです。

于 2012-04-10T22:47:18.533 に答える
48

パッケージ/モジュールの複数のバージョンがある場合は、virtualenvを使用する必要があります(私の強調):

virtualenvは、分離されたPython環境を作成するためのツールです。

対処されている基本的な問題は、依存関係とバージョンの1つ、および間接的なアクセス許可です。LibFooのバージョン1を必要とするアプリケーションがあり、別のアプリケーションがバージョン2を必要とする場合を想像してください。これらの両方のアプリケーションをどのように使用できますか?すべてを/usr/lib/python2.7/site-packages(またはプラットフォームの標準的な場所に)インストールすると、アップグレードすべきでないアプリケーションを意図せずにアップグレードする状況に陥りやすくなります。

または、より一般的には、アプリケーションをインストールしてそのままにしておきたい場合はどうでしょうか。アプリケーションが機能する場合、そのライブラリまたはそれらのライブラリのバージョンを変更すると、アプリケーションが破損する可能性があります。

site-packagesまた、グローバルディレクトリにパッケージをインストールできない場合はどうなりますか?たとえば、共有ホスト上。

これらすべての場合において、virtualenvあなたを助けることができます。独自のインストールディレクトリを持つ環境を作成し、他のvirtualenv環境とライブラリを共有しません(オプションで、グローバルにインストールされたライブラリにもアクセスしません)。

それが人々が間違っていると考える理由insert(0, です-それは複数の環境を管理する問題に対する不完全な、一時的な解決策です。

于 2012-04-10T19:23:47.757 に答える
13

追加と先頭追加の概念を混同しています。次のコードが先頭に追加されます。

sys.path.insert(1,'/thePathToYourFolder/')

インタープリターが通過する検索シーケンスの最初 (正確には 2 番目) に新しい情報を配置します。sys.path.append()検索シーケンスの最後に物事を置きます。

virtualenvパッケージ ディレクトリを手動でPYTHONPATH毎回コーディングする代わりに、次のようなものを使用することをお勧めします。サイト パッケージと可能なバージョンの Python を分離するさまざまなエコシステムをセットアップするには、次の 2 つのブログをお読みください。

  1. Python エコシステムの紹介

  2. Python 仮想環境のブートストラップ

環境分離への道を進むことにした場合は、virtualenvwrapper を調べることで確かに利益が得られます: http://www.doughellmann.com/docs/virtualenvwrapper/

于 2012-06-24T18:01:20.733 に答える