2013-11-27 9 views
9

次のように私はPythonパッケージのディレクトリを持っている:スフィンクスとPython 3の相対的な輸入*

--docs/index.rst 
--docs/... 
--app/__init__.py 
--app/foo.py 

と私は(のpython 3.3で)アプリを文書化するためautodocsとスフィンクスを使用しています。

さて、conf.pydocs/内側)に、私は私の

はSystemError与え

make html 

実行し、docs/

sys.path.insert(0, os.path.abspath('../app')) 

I cdを持っている:親モジュール '' ではないがロード済み、相対インポートは実行できません。

私のpython 3.3用(クリーン)環境を作成した後、私が持っている

from .foo import Bar 

を持っているすべてのモジュールへ

スフィンクスのクリーンvirtualenvのインストールは

pip install Sphinx 

を使用します。

私には何が欠けていますか?

私はこのプロジェクトをPython 2. *からPython 3. *に移動していました。すべてのプロジェクトは動作していますが、これは...

+0

'app'はトップレベルのパッケージ自体か、トップレベルのパッケージが入っているディレクトリですか? – abarnert

+0

私はあなたの質問を理解していないと思います。 'app'は内部にディレクトリを持っておらず、' __init __。py'を含む '* .py'のセットだけです。スフィンクスはアプリケーションディレクトリのみを文書化します。 –

+0

'app'の中に' __init __。py'があると、それはパッケージです。それがあなたの問題です。説明する答えを書こう。 – abarnert

答えて

14

appディレクトリはパッケージです。パッケージは__init.py__とその中の他のファイルを持つディレクトリです。

sys.pathにパッケージディレクトリを置くと、すべての種類の問題が発生します。

のは、たとえばみましょう:それはあなたの現在の作業ディレクトリですので、または明示的にそれを行うため、またはあなたが正しく物事をインストールしているので、あなたがあなたのsys.path(上rootを持っている場合は

root/ 
    app/ 
     app/__init__.py 
     app/spam.py 
     app/eggs.py 

site-packages)、appはパッケージ、app.spamはモジュール、app.eggs以内には.spamがそのモジュールです。だから、すべてが動作します。

あなたsys.pathappを持っている場合は、appeggs内、.spamは何もないが、spamはモジュールで、パッケージではありません、と。したがって、相対インポートを使用することはできません。

あなたsys.pathbothを持っている場合は、appがあるパッケージ、spamapp.spamが(2回実行と同じ内容で、)の両方が異なるモジュールであり、app.eggs.spam WITHINをeggsモジュールですが、、 .spamは何もありません。これで問題の終わりはありません。


ので、ほとんどの場合、あなたがしたいの修正はこれです:あなたはドン..でパッケージされない他のパッケージ、またはPythonコードの完全なディレクトリがある場合、」

sys.path.insert(0, os.path.abspath('..')) 

tはautodocのにしたい(例えば、tests/test_spam.pytestsディレクトリ)、その後、あなたはこのように、それに他のPythonコードを持っていないいくつかのディレクトリにappを置くために、あなたのディレクトリを再構築する必要があります。

root/ 
    src/ 
     app/ 
    tests/ 
    doc/ 
代わり

、あなたはappパッケージするのではなく、のsys.pathのルートディレクトリであることを、そして__init__.pyを殺し、そしてsys.pathに直接appを残したくなかった場合。しかし、その場合は、パッケージ内相対インポートを使用することはできません。 appのモジュールはすべてトップレベルのモジュールであり、そのままインポートする必要があります。


チュートリアル(およびそれ以上の章の残りの部分)のPackagesセクションでは、こののいくつかを説明し、おそらくより良い入門ドキュメントがそこにあります。

詳細については、3.3 +で、The import systemにはすばらしい整理があります。古いバージョンの場合、リファレンスドキュメントは濁っていて、不完全で、散在しています。 The import statementから始めてThe Knights Who Say Neeeow ... Wum ... Ping!(これは基本的にはPEPですが、1.5にはまだPEPがありません)と、場合によってはniのドキュメントも読んでください。さらに、説明できるさまざまなPEPとマイナーな変更ログエントリ物事が1.5から2.7または3.2の間でどのように変化したか。

+0

非常に良い答えです。ありがとうございました。私は、新しいシステムについて多くのことを学ぶことができることを実感しました。 –

+2

@J.C.Leitão:Python 2.xで同じことをしていたのであれば、それも間違っていました。 Python 1.5スタイルとPython-3.3スタイルの中間にあるものを書くことで2.7を得ることができます。 – abarnert

関連する問題