17

ディレクトリ構造を想像してください。

/
    /
        __init__.py
        b.py
        c.py
    c.py

ファイル/a/b.pyは次のようになります。

インポート c
should_be_absolute = c

他のすべてのファイル (を含む__init__) は空です。

テスト スクリプトを実行する場合 (python 2.7 を使用):

import a.b
print a.b.should_be_absolute

PYTHONPATH=/空のディレクトリから(したがって、現在のディレクトリからは何も追加されません)PYTHONPATH取得します

<module 'a.c' from '/a/c.py'>

PEP 328import <> is always absoluteと私が期待する声明によると:

<module 'c' from '/c.py'>

ファイルを削除すると、出力は期待どおりになり/a/c.pyます。

私は何が欠けていますか?そして、これが正しい動作である場合 - (の代わりに)cからモジュールをインポートする方法は?ba.c

アップデート:

python dev メーリング リストによると、ドキュメントのバグのようです。Python27 では、インポートはデフォルトで絶対ではありません。

4

3 に答える 3

27

Python 2.7で追加from __future__ import absolute_importまたは使用する必要がありますimportlib.import_module('c')

Python 3 ではデフォルトです。

Python にはバグがあり__future__.py、そのドキュメントでは絶対インポートが 2.7 で必須になったと主張していますが、そうではありませんでした。

于 2012-07-31T13:58:38.973 に答える
0

PYTHONPATH に追加するだけの場合、検索順序は引き続き現在のディレクトリ/を探している可能性があります。cすべてをルートパッケージの下に置き、それを絶対に参照する方がはるかに良いでしょう:

/myPackage
    a/
        __init__.py
        b.py
        c.py
    __init__.py
    c.py

そして、次のような PYTHONPATH: export PYTHONPATH=/:$PYTHONPATH

したがって、あなたa.cは次のことを行います:

from myPackage import c
from myPackage.c import Foo
import myPackage.c

このように、常にパッケージに対して相対的です。

于 2012-07-30T17:52:40.290 に答える
-1

「絶対」とは、あなたが思っていることを意味するものではありません。代わりに、「通常の」パッケージ解決手順が行われることを意味します。まず、パッケージのディレクトリを調べ、次に sys.path のすべての要素を調べます。これには PYTHONPATH の要素が含まれます。

本当に必要な場合は、imp モジュールなどのツールを使用できますが、このようなものには使用しないことをお勧めします。一般に、標準の Python ディストリビューションと同じ名前のモジュールを作成する必要はありません。

于 2012-07-31T10:08:02.137 に答える