2

Pythonでの長い経験の中で、本当に奇妙な問題が発生しています。

事前に、コードを変更する方法や修正する方法ではなく、なぜこれが発生するのかを知りたいと思います。

私はpython2.7.3を使用していて、この__future__ absolute_import機能を使用しています。私は少し複雑なモジュール構造を持っています..私はモジュールを持っていますq.x.y.z。一番上にある場合はimport q.x.a.b機能import q.x.a.b as _bしますが、qxに「a」(このモジュールの前に数回インポートされています)がないと言っても失敗します。何が起こっているのかを知るのに十分な経験がある人はいますか?as _b「 」を削除するだけで魔法のように機能するので、循環インポートの問題ではないと確信しています。また、私はそれについて本当に注意しているので、命名の問題ではありません。

ファイル構造は次のとおりです。

q/
+ __init__.py
+ main.py #execution entry point
--- x/
    + __init__
    + a/
      + __init__
      + b.py 
   + y/
      + __init__
      + z.py # import q.x.a.b

q pkg> python q \ main.pyの親フォルダーから実行され、次のものが含まれています。

from __future__ import absolute_import
import sys, os

if __name__=='__main__':
    sys.path[0] = os.getcwd()
    import q
    q.run()

循環インポートに少し関連していますが、それでも主な質問は、「as」を使用するとなぜそれが発生するのかということです。

トレースバックは次のようになります。

q/main.py: q.run()
q/x/__init__.py : from q.x import a, y, k
q/x/a/__init__.py : from q.x.a import d, e, f
q/x/a/f.py : from q.x.y import z as _z
q/x/y/__init__.py : from q.x.y import g, h, z
q/x/y/h.py : import q.x.a.d as _d

これは何か関係がありますか? https://stackoverflow.com/a/1835089/260242 またはこの https://stackoverflow.com/a/11309252/260242

実際に失敗するコードのサンプル...test/ q / x / y / h.pyに移動し、インポートを_dとしてインポート...に変更すると、http://puu.shが表示されます 。 / 16C3j

4

1 に答える 1

2

申し訳ありませんが、少なくとも私が持っているPython 2.6.5を使用して再現できません。

クリーンなツリーで問題を示す最小限のケースを切り分けるために、時間をかけてください。現在のツリーのコピーから始めて、関係のないディレクトリを削除し、関数定義などを削除します。これらすべてが、問題がまだ存在することを常にチェックしています。プロセスは、バグを示す最小限のケースに収束するか、または (おそらく) この奇妙な動作を実際に引き起こす一見無関係なものを示します。

これは Linux コンソールからの私の作業ログです。空のディレクトリで再生できます。

mkdir -p q/{x,y}
echo > q/__init__.py
echo > q/x/__init__.py
echo > q/y/__init__.py
mkdir -p q/x/a
echo > q/x/a/__init__.py
echo "place='This is q.x.a.b'" > q/x/a/b.py
echo -e "import q.x.a.b as _b\n\nprint _b.place" > q/y/z.py
python -c 'from __future__ import absolute_import; import q.y.z'

期待どおりに印刷されますThis is q.x.a.b

于 2012-09-19T13:47:34.607 に答える