最近、python 3 にアップグレードし、スクリプトの一部を変換することにしました。という名前のモジュールを使用するスクリプトで問題が発生しましたio
-python 2ではこれは完全に問題ありませんが、python 3ではio
ファイルの標準モジュールです。同じ種類の問題についてこの古い質問を見つけましたが、これはpython 2を参照しているようです.2つのファイルがmain.py
ありio.py
、トップレベルのパッケージでimport io
は、ローカルではなくmain.py
標準io
モジュールをインポートします. 1。from __future__ import absolute_imports
役に立たなかったし、from . import io
関連する試みは期待どおりに失敗します(これは私には理解できませんでした-pythonは本当にトップレベルのパッケージがどこにあるのかわかりませんか?)。名前の変更は明らかに解決策ですが、可能であれば避けたいと思います。モジュール名の競合を解決する python 3 の標準的な方法はありますか?
質問する
2245 次
1 に答える
0
これが私の答えです:-
私のディレクトリ構造:-
calvin$ tree /Users/calvin/work/learn3/
/Users/calvin/work/learn3/
└── myspecialpackage
├── __init__.py
├── __init__.pyc
├── io.py
├── io.pyc
└── main.py
__init__.py
空のファイルです。
io.py
python3のioモジュールと競合するカスタムモジュールです。
main.py
この一連のサンプルコードが含まれています:-
import os
import sys
# These two lines are not needed you are installing the `myspecialpackage` via pip/pypi and as setup.py script places "myspecialpackage" and all its contents in your python site-packages, which is already in PYTHONPATH.
our_package_root = os.path.dirname(os.path.realpath(__file__))
sys.path.append(our_package_root)
from myspecialpackage import io
print(io.__file__)
また、インポートされたio
モジュールは、io.py
python3のモジュールではなく、ユーザーのモジュールになります。
ボーナスとして、この方法論を使用するとio.py
、python3のio
モジュールだけでなくカスタムも使用できるようになります(ケーキを持って食べたい場合は;-))。io
次のように、名前空間の使用の競合を解消できます。-
from myspecialpackage import io as my_special_io
print(my_special_io.__file__)
import io
print(io.__file__)
実行main.py
すると、次のようになります。-
In [3]: run myspecialpackage/main.py
/Users/calvin/work/learn3/myspecialpackage
./myspecialpackage/io.py
/Users/calvin/.virtualenvs/learn3/bin/../lib/python3.3/io.py
上記のコメントに注意してください
our_package_root = os.path.dirname(os.path.realpath(__file__))
sys.path.append(our_package_root)
于 2012-11-04T09:12:44.383 に答える