sys.path.insert(1、path)の代わりにsys.path.append(path)を使用するのはなぜですか?


88

編集: 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)あなたが手動でパスを挿入しているように、私たち(コミュニティとして)が推薦し始めたら本当にそれが欲しいです私はそれがあなたが望むパスであると言っても安全だと思います使用する!

それとも何か問題がありますか?それは時々私を悩ませ、私はそれをオープンに望んでいた質問です!


3
実行しましたsys.path.insert(1, dev_folder)が、まだdevモジュールが見つからず、インストールされているモジュールのみを使用しています。これを修正するにはどうすればよいですか?
endolith 2014年

回答:


47

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

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

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

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

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

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

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


おかげさまで、このようなものが存在することは漠然と知っていましたが、実際にチェックしたことはありません。だから私がこれでやらなければならないのは、仮想環境でインタプリタからすべてを実行することです...それもうまくいく可能性があります。ありがとう!
ギャレットバーグ

1
これは、(例えば、私が使用しない強い理由がある提案であるが、直接の質問に答えていませんvirtualenvOPに関連する答えを探しています、実際と)
javadba

@javadbaそれはあなたの場合に当てはまるかもしれませんが、この質問をするほとんどの人はを使用する必要がありますvenv
AGF

46

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

sys.path.insert(1, path_to_dev_pyworkbooks)

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

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


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/


1
「Pythonエコシステムの紹介」、「Python仮想環境のブートストラップ」のリンクは廃止されました。それらの活性化を検討してください。
Pradeep Singh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.