3


3

パッケージ構造が重複しているPYTHONPATH hell

Windows XPでPythonPathに問題があり、何か間違ったことをしているのではないかと思っています。

`src`ディレクトリがあるプロジェクト(Pydevで作成)があるとします。 「src」の下には「common」という名前の単一のパッケージがあり、その中に「service」というクラス名を持つ「service.py」という名前の単一のクラスモジュールがあります

`src`ディレクトリと共通パッケージを含む別のプロジェクト(Pydevで作成された)があるとしましょう。 共通パッケージには、サービスをインポートする単一のスクリプト「client.py」があります。

つまり、2つのディスクの場所は同じですが、パッケージは同じです。

`PYTHONPATH`に両方のsrcディレクトリを含めるように設定しても、ファイルが両方とも同じディレクトリにない場合、インポートは失敗します。 モジュールが見つかりませんでした。

Pythonがモジュール名を解決する方法を誤解していますか? 私はJavaとそのクラスパスの地獄に慣れています。

3 回答


2


本当にこのような分割パッケージが必要な場合は、モジュールレベルの属性pathを参照してください。

要するに、「src」ディレクトリの1つをメインディレクトリにし、他の「src」のパスをpathリストに追加するinit.pyを指定します。 Pythonは、 'src’のサブモジュールを検索するときに、両方の場所を検索します。

しかし、長期的にはこれをお勧めしません。 それは一種のもろさで、物を動かすと壊れます。


1


Pythonでは、各パッケージに一意の名前を付けることで、この問題を回避するのが最善だと思います。 両方のパッケージに「common」という名前を付けないでください。 その後、次のようなもので両方をインポートできます

import common1.service as cs
import common2.client as cc


1


このようにインポートしようとすると:

import src.common.service

Pythonは、Pythonパスで「src」(またはeggなど)という名前のディレクトリを探します。 「src」が見つかると、別のものを考慮しません。 最初の「src」に共通のサービスが含まれていない場合、パス内の別の「src」ディレクトリにこれらのものがある場合でも、ImportErrorが発生します。