2012-07-30 6 views
17

は、ディレクトリ構造を想像してみてください。python27では、インポートがデフォルトで絶対に行われてはいけませんか?空になっている(<code>__init__</code>含む)</p> <pre> import c should_be_absolute = c </pre> <p>他のすべてのファイル:<code>/a/b.py</code>がどのように見える</p> <pre> / a/ __init__.py b.py c.py c.py </pre> <p>ファイル:

(のpython 2.7を使用して)テストスクリプト実行している:応じてどこが

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

を取得する(ので何もカレントディレクトリからPYTHONPATHに追加されていない)空のディレクトリからPYTHONPATH=/

import a.b 
print a.b.should_be_absolute 

PEP 328に、import <> is always absoluteという文があります。

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

/a/c.pyファイルを削除すると、期待どおりの出力が得られます。

私には何が欠けていますか?そして、これが正しい動作ならば、ba.cではなく)からcモジュールをインポートする方法は?

更新:

python dev mailing listによると、ドキュメントのバグのように見えます。インポートはではなく、デフォルトでpython27ではではありません。

+0

完全なpythonパスは何ですか? /それだけ?おそらく、ルートパッケージ名 – jdi

+3

FWIWを使用しているはずです。これはPython 3で期待どおりに動作します。 – geoffspear

+0

@jdi - はいルートはPYTHONPATHの唯一のものです(元の投稿を編集してより明示的にします) – karolx

答えて

26

あなたはfrom __future__ import absolute_importを追加したり、それは、Python 3でのデフォルトであるimportlib.import_module('c')

2.7 Pythonの上を使用する必要があります。

Pythonにバグがありました:__future__.py and its documentation claim absolute imports became mandatory in 2.7, but they didn't

+2

あなたは正しいです!さらに掘り下げた後、私は[python-devメーリングリスト](http://python.6.n6.nabble.com/status-of-absolute-import-w-python-2-7-td1850742.html)へのリンクを見つけました)python27でabsolute_import機能がデフォルトでオンになっていないことを確認します。 – karolx

+0

ばかげた... –

0

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

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

などPYTHONPATH:だからあなたのa.cあなたは、これらのでしょうでexport PYTHONPATH=/:$PYTHONPATH

を:

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

この方法では、この方法では常にパッケージに相対的です。

+0

ありがとうございます。問題は、これを動作させるためにコードを再編成するのではなく、これが正しい動作であるかどうかです。私が解決している実際の問題は、 'c'はPythonビルドインモジュールの名前で、私が働いているコードはそれをシャドーイングしています(そして、Pythonのドキュメントによればならないはずです) – karolx

-1

「絶対」は、あなたが思うとは限りません。代わりに、 "通常の"パッケージ解決プロシージャが実行されることを意味します。まず、パッケージのディレクトリを探し、次にsys.pathのすべての要素を探します。これはPYTHONPATHの要素を含みます。

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

+0

Thanks @Ivoしかし、[PEP 328#絶対的な理由の理論的根拠](http://www.python.org/dev/peps/pep-0328/#rationale-for-absolute-imports)には、絶対的なインポートは常に行われると書かれていますsys.path_から到達可能なモジュールまたはパッケージ最初にパッケージディレクトリ内のルックアップについては何もありません。あなたが記述した動作を文書化するいくつかのリソースを指摘できますか? – karolx

+0

http://docs.python.org/reference/simple_stmts.html#importは、実装されているプロセスで非常に明確です。「インポートされるモジュールがパッケージ内に含まれると想定されている場合、2番目の引数がfind_module ()、親パッケージの__path__は、パスのソースとして使用されます。 – Ivo

+0

"まず、パッケージのディレクトリを探します"。いいえ、それは相対的な輸入です。 –

関連する問題

 関連する問題