71

まず第一に、申し訳ありませんが、相対インポートについて多くの質問があったことは知っていますが、解決策が見つかりませんでした. 可能であれば、次のディレクトリ レイアウトを使用したいと思います。

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

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

  • パッケージ内のテスト ファイルはどのように myClass.py を適切にインポートしますか?

  • myClass を libs/myClass または include/myClass のサブモジュールとして使用すると仮定すると、パッケージを外部からどのようにインポートしますか?

これまでのところ、これに対するエレガントな解決策を見つけることができませんでした。私が理解しているGuidoの決定から、それは可能であるはずですfrom ..src import myClassが、これはエラーになります:

ValueError: Attempted relative import in non-package

myClass をパッケージとして扱わないように見えます。ドキュメントを読む

__init__.py ファイルは、Python がディレクトリをパッケージを含むものとして扱うために必要です。

パッケージのスクリプトがどこにあるかを指定する何かが欠けているようですが、 .pth を使用する必要がありますか?

4

3 に答える 3

42

ValueError: Attempted relative import in non-package

パッケージではないモジュールで相対インポートを使用しようとしていることを意味します。from ... importインポートしようとしているファイルではなく、このステートメントを含むファイルに問題があります。

たとえば、テストで相対インポートを行う場合は、テストをパッケージの一部にする必要があります。これの意味は

  1. __init__.pyテストに追加/
  2. ノーズテストなどの外部スクリプトから実行する

として何かを実行するとpython myClass/test/demo.py、パッケージとしてではなくデモモジュールを実行しているため、相対インポートも機能しません。相対インポートでは、それらを使用するモジュール自体がパッケージ モジュールとしてfrom myClass.test.demo import blabla、または相対インポートでインポートされている必要があります。

于 2010-12-04T03:15:48.013 に答える
28

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

フォルダ階層:

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

デモ.py:

from ..src import myClass

def printer():
    print(myClass.randomMaths(42))

main.py:

import test.demo

demo.printer()

demo.pyインタープリターで実行するとエラーが発生しますが、実行するとエラーにmain.pyなりません。少し複雑ですが、うまくいきます:D

于 2012-05-23T03:59:34.950 に答える
0

パッケージ内参照myClassでは、からの方法について説明していtest/*ます。外部からパッケージをインポートするには、インポートPYTHONPATHアプリケーションを実行する前に環境変数にそのパスを追加するか、sys.pathインポートする前にコードにリストする必要があります。

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

于 2010-12-03T18:19:57.670 に答える