バックグラウンド
名前空間パッケージを使用し、コードベースを個別のフォルダーに分割すると、pylint がファイルをインポートできないという問題にうんざりしています。そのため、問題の原因として特定されている astNG ソースコードを掘り下げ始めました ( astng のバグレポート8796を参照)。imp.find_module
問題の中心にあるのは、インポートを見つけるプロセスで独自の python を使用しているようです。
何が起こるかというと、インポートの最初の (サブ) パッケージ - a
in import a.b.c
-find_module
にNone
パスが渡されます。戻ってきたパスは、前の例でfind_module
見つけようとするルックアップ ループの次のパスに送られます。b
logilab.common.modutils からの疑似コード:
path = None
while import_as_list:
try:
_, found_path, etc = find_module(import_as_list[0], path)
#exception handling and checking for a better version in the .egg files
path = [found_path]
import_as_list.pop(0)
問題
これがfind_module
問題です。サブパッケージが含まれている場合と含まれていない場合があります。サブパッケージが見つからない場合、バックアウトして次のパッケージを試す方法はありません。
結果をパスリストから削除して2回目の試行を行うことができるように、Noneの代わりにsys.pathを明示的に使用してみましたが、pythonのモジュールファインダーは十分に賢いため、パスに完全に一致する必要はありません、このアプローチを使用できなくします-とにかく私の知る限りでは。
涙目の嘆願
可能なすべての一致を返すか、除外リストを取るfind_modulesの代替手段はありますか? 私はまた、まったく異なるソリューションに対してオープンです。手動で python にパッチを当てないことが望ましいですが、少なくともローカル ソリューションの場合は不可能ではありません。
(注意事項:私はpython 2.6を実行していますが、現在の会社のポリシーがアップグレードできないため、p3kなどの提案は、それが唯一の答えでない限り、承認済みとしてマークされません。)