2010-12-03 14 views
70

最初にすべて:私は申し訳ありませんが、相対輸入について多くの質問がありましたが、私は解決策を見つけられませんでした。可能であれば、私は次のディレクトリレイアウトを使用したいと思います:相対輸入のためのPythonパッケージ

myClass/ 
    __init__.py 
    test/ 
     demo.py 
     benchmark.py 
     specs.py 
    src/ 
     __init__.py 
     myClass.py 

は今私の質問は以下のとおりです。

パッケージ内からテストファイルが正しくmyClass.pyをインポートするにはどうすればよい
  • libs/myClassまたはmyClassを含むサブモジュールとしてmyClassを使用すると仮定して、パッケージを外部からどのようにインポートしますか?

これまでのところ、私はこれに対してエレガントな解決策を見つけることができませんでした。私はGuido's Decisionを理解して何から、from ..src import myClassを行うことが可能であるべきであるが、これはエラーになります。それは、パッケージとしてのMyClassを扱っていないように見えます

ValueError: Attempted relative import in non-package

を。 Reading the docs

​​

私が私が.pthを使用する必要があり、パッケージのスクリプトは、ある場所を指定する何かが欠けてるようですか?

+6

@Brent Newey、はい、あなたは正しいです、相対的な輸入は、進行中の話題と思われ、かなりの答えを読んだ後、私はまだ私の状況を具体的に説明する衝動を感じた。このqを表示した後、#python IRCチャンネルでかなりの人がフラットなディレクトリ構造を使うことを勧めました: "多くの人が、意味論的な名前空間情報のためにPythonがディレクトリとファイルを使用する方法に抵抗します。 Pythonが望んでいるもの。 " http://jcalderone.livejournal.com/39794.html – eerne

+8

誰かが実際のパッケージへのリンクを提供してもよいでしょうか、模範的なディレクトリレイアウトや、いくつかの規則に従ってください。 (理想的にはgithub上で) – eerne

+1

'__init __。py'は' test'ディレクトリにありますか? 'ValueError:非パッケージでの相対インポートを試みました.'と関連している可能性があります。 – jfs

答えて

0

Intra-package-referencesは、どのように記述するかmyClassからtest/*までです。パッケージを外部からインポートするには、インポータアプリケーションを実行する前に環境変数PYTHONPATHにパスを追加するか、インポートする前にコードにsys.pathのリストを追加する必要があります。

なぜfrom ..src import myClassが失敗するのでしょう:おそらく、srcはpythonパッケージではありません。そこからインポートすることはできません。上記のように、Pythonのパスに追加する必要があります。

+0

相対インポートは常に実行されます。多くのパッケージでは、より小さなサブパッケージがあり、相対インポートに依存しています。 OPは外部パッケージを参照する方法を尋ねていません。彼は、パッケージ内の別のサブパッケージをどのように参照するかを尋ねています。 – cstrutton

41

ValueError: Attempted relative import in non-package

パッケージではないモジュールで相対インポートを使用しようとしています。このfrom ... import文を持つファイルに問題があり、インポートしようとしているファイルではありません。

たとえば、テストで相対インポートを行っている場合は、テストをパッケージの一部にする必要があります。これは、あなたがpython myClass/test/demo.pyとして何かを実行する場合は、デモモジュールを実行しているので、nosetests

のように、相対的な輸入があまりにも動作しません、いくつかの外部のスクリプトからそれらをランニング/

  • をテストするために__init__.pyを追加

    1. を意味し、パッケージではありません。相対インポートでは、それらを使用するモジュールがパッケージモジュールfrom myClass.test.demo import blablaとしてインポートされるか、または相対インポートでインポートされる必要があります。

  • 25

    私は昨夜の検索の時間の後に、Pythonでの相対的なインポートに対する答えを見つけました!少なくとも、簡単な解決策です。これを修正して、別のモジュールから呼び出されたモジュールを持つ最良の方法です。つまり、demo.pyが、サブパッケージのルートのMyClassフォルダにあるmyClass.py をインポートして、他の2つを呼び出すファイルを持つ必要があるとします。私が収集したものから、作業ディレクトリは常にメインとみなされます。したがって、demo.pyスクリプトからdemo.pyからインポートをテストすると、そのエラーが表示されます。説明するために:

    フォルダhierarcy:

    myClass/ 
        main.py #arbitrary name, can be anything 
        test/ 
         __init__.py 
         demo.py 
        src/ 
         __init__.py 
         myClass.py 
    

    myClass.py:

    def randomMaths(x): 
        a = x * 2 
        y = x * a 
        return y 
    

    demo.py:

    from ..src import myClass 
    
    def printer(): 
        print(myClass.randomMaths(42)) 
    

    main.py:

    import test.demo 
    
    demo.printer() 
    

    インタープリタでdemo.pyを実行するとエラーが発生しますが、main.pyを実行するとエラーは発生しません。それはちょっと複雑ですが、それは動作しますが、それは動作します:D

    +3

    私はPython 2.7を使用しています。私は3つのことを行うことで上記のコードを取得できました。まず、main.pyがあるレベルで、 '__init __。py'を追加しました。次に、demo.printer()を 'test.demo.printer()'に変更しました。第三に、main.pyの上にディレクトリを変更し、 'python -m myClass.main'を実行しました。そうでなければ、これは私にとって非常に有益な答えでした。 :) – Paul

    関連する問題