1242

同じディレクトリ内の別のファイルから関数をインポートしたい。

時々それは私のために働きますがfrom .mymodule import myfunction、時々私は得る:

SystemError: Parent module '' not loaded, cannot perform relative import

で動作するfrom mymodule import myfunctionこともありますが、次のようになることもあります。

SystemError: Parent module '' not loaded, cannot perform relative import

ここのロジックが理解できず、説明が見つかりませんでした。これは完全にランダムに見えます。

誰かがこのすべての背後にあるロジックを説明してもらえますか?

4

24 に答える 24

59

この問題に遭遇しました。ハックの回避策は、次のような if/else ブロックを介してインポートすることです。

#!/usr/bin/env python3
#myothermodule

if __name__ == '__main__':
    from mymodule import as_int
else:
    from .mymodule import as_int


# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()
于 2015-01-26T14:21:36.923 に答える
8

動作させるには、メイン プロジェクト ディレクトリから python3 を実行する必要がありました。

たとえば、プロジェクトに次の構造があるとします。

project_demo/
├── main.py
├── some_package/
│   ├── __init__.py
│   └── project_configs.py
└── test/
    └── test_project_configs.py

解決

フォルダーproject_demo/内で python3 を実行してから、

from some_package import project_configs
于 2018-09-11T18:49:29.027 に答える
6

実行可能なスタンドアロンmoduleで相対インポートを使用して作成する定型文。package

package/module.py

## Standalone boilerplate before relative imports
if __package__ is None:                  
    DIR = Path(__file__).resolve().parent
    sys.path.insert(0, str(DIR.parent))
    __package__ = DIR.name

from . import variable_in__init__py
from . import other_module_in_package
...

これで、モジュールを任意の方法で使用できます。

  1. 通常どおりモジュールを実行します。python -m package.module
  2. モジュールとして使用します。python -c 'from package import module'
  3. スタンドアロンで実行します。python package/module.py
  4. またはシバン(#!/bin/env python)で:package/module.py

注意!sys.path.appendの代わりに を使用すると、が と同じ名前のsys.path.insert場合、追跡が困難なエラーが発生します。例えばmodulepackagemy_script/my_script.py

もちろん、パッケージ階層の上位レベルからの相対インポートがある場合、これでは十分ではありませんが、ほとんどの場合は問題ありません。

于 2021-01-18T19:05:24.603 に答える