mine.py が moduleA と moduleB をインポートしたいが、moduleA と moduleB がそれぞれ「moduleC」というモジュールをインポートしようとしているとします。これらは 2 つの異なるモジュールで、どちらも「moduleC」という名前になっています。mine.py が実行されると、sys.path に応じて、moduleA または moduleB のいずれかが正しい「moduleC」を取得し、もう一方は驚き、混乱が生じます。
moduleA と moduleB が別の作成者によって作成され、どちらも私たちではない場合、それらのモジュールを変更しないことをお勧めします。moduleA または moduleB を変更しない mine.py の作成者が利用できる解決策はありますか?
次の質問は、あなたが moduleA または moduleB の作成者である場合に、この問題を解決する方法を尋ねます。
同名のモジュールが存在する場合の組み込みライブラリからのインポート
同じ名前のローカルモジュールがある場合、Python で標準ライブラリモジュールにアクセスする方法は?
私の特定のケース
Python デバッガー pdb で PyMOL というプログラムを実行したいと考えています。残念ながら、PyMOL にはインポートする「cmd.py」があり、pdb がインポートする通常の cmd と競合します。
PyMOL インストールの関連部分は次のようになります。
pymol/
__init__.py
cmd.py
PyMOL は を実行することで実行され__init__.py
ます。このファイルはcmd
、from pymol import cmd
.
BrenBarnが指摘したことから作業すると、これまでpdb
のところ、ディレクトリをcmd
一時的に削除することで、 . その後、PyMOL がそのインポートを試みるとクラッシュします。どういうわけか、インポートの前に、インポートの後に、インポート モジュールの検索からPython を削除する必要があります。pymol
sys.path
cmd
cmd
PyMOL
pdb
最小限の例
$ ls
pymol/
$ ls pymol/
__init__.py cmd.py
初期化.py
# insert some code into __init__.py directly
import sys
pymol_path = sys.path[0]
sys.path[0] = ""
import pdb
sys.path[0] = pymol_path
from pymol import cmd
# test a sandwich of calls that require each "cmd" modules
pdb.set_trace()
cmd.foo()
pdb.set_trace()
cmd.foo()
print "done!"
# original PyMOL __init__.py code would follow
cmd.py
def foo():
print("cmd.foo()")
それを試してみてください
$ PYTHONPATH= python ./pymol/__init__.py
> /Users/khouli/scr/pymol_scr/pymol/__init__.py(11)<module>()
-> cmd.foo()
(Pdb) continue
cmd.foo()
> /Users/khouli/scr/pymol_scr/pymol/__init__.py(13)<module>()
-> cmd.foo()
(Pdb) continue
cmd.foo()
done!
編集:上記の方法は機能しているように見えますが、BrenBarnの回答が述べているように、質問が最初に求めたように、すべてのサードパーティコードを変更しないままにする解決策はおそらくありません. これは、PyMOL の癖によるものです。