3

最近、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 の標準的な方法はありますか?

4

1 に答える 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.pypython3の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.pypython3のモジュールではなく、ユーザーのモジュールになります。

ボーナスとして、この方法論を使用すると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 に答える