2011-09-14 5 views
11

は私がディスク上に次のような構造を持つパッケージを開発しています:Pythonパッケージの標準ライブラリパッケージ名で名前空間の競合を解決するにはどうすればよいですか?

foo/ 
    __init__.py 
    xml.py 
    bar.py 
    moo.py 

xml.pyパッケージには、SAXストリームパーサを使用して、他のパッケージコンポーネントのためのいくつかのカスタムXML解析および翻訳を行うクラスを提供します。

import xml.sax 
import xml.sax.handler 

しかし、私は私が手アプリケーションでを使用するために行くとき:だから、それはそれであり

Traceback (most recent call last): 
    File "testxmlparser.py", line 15, in <module> 
    import foo.xml 
    File "~/code/foo/xml.py", line 39, in <module> 
    import xml.sax 
ImportError: No module named sax 

を私は名前空間の競合を持っているように見えます。 xml.pyの名前をxmlparser.pyのように変更すると、すべてが正常に動作します。しかし、これは間違ったことのように感じます。私はPythonのパッケージ名と解像度に関する根本的なものをここで失っているように感じます。

foo/xml.pyファイルの名前を変更することなくこの作業を行う適切な方法はありますか?それとも、本当に矛盾する名前の唯一の解決策ですか?

編集:「標準のPythonモジュールと同じ名前を付けないようにする」と思われます。これは、時間の経過とともに変化し、成長する標準的なモジュールセットである動く標的です。だから本当にあなたの名前でクリエイティブを取得しない限り、名前を変更するまでのあなたの発見 - 何かの矛盾の解決策は私には貧しいようです。また、fooというユニークなパッケージ名を既に持っています(私はfooを使用していませんが、それは確かにユニークなものです)。

答えて

13

としては

from __future__ import absolute_import 

を使用し、必要に応じてrelative importsを使用し、over hereを述べました。

+0

問題は、「xml.sax」が* my *パッケージに含まれていないことです。したがって、それを相対的にインポートすることはできません。それが実際に私が今失敗している理由です。 Pythonは、 'xml.sax'が私の' foo.xml'パッケージとの相対的なものであると考えていますが、そうではありません。 –

+0

それはまさに私が後にしたものでした。ありがとう! –

関連する問題