2

Python のインポート。また...

私はこのファイル構造を持っています:

[test]
    start.py (from scripts import main)
    [scripts]
        __init__.py (empty)
        main.py (from . import install)
        install.py (from scripts import main # or # from . import main)

インポートエラーが発生します:

vic@wic:~/projects/test$ python3 start.py 
Traceback (most recent call last):
  File "start.py", line 2, in <module>
    from scripts import main
  File "/home/vic/projects/test/scripts/main.py", line 1, in <module>
    from . import install
  File "/home/vic/projects/test/scripts/install.py", line 1, in <module>
    from scripts import main
ImportError: cannot import name main
vic@wic:~/projects/test$

わかりません:初めてfrom scripts import main機能しました(「機能した」とは、で失敗しなかったことを意味しますImportError)、2回目は同じコードが得られますImportError: cannot import name main

何が起こっている?

アップデート:

私の質問は、循環インポートに関するものではありません。まったく同じコードがfrom scripts import main最初は正常に機能し、2 回目は失敗するという事実に混乱しています。

私が理解していない内部インポートメカニズムがあると思います。

最初にステートメントがモジュールをインポートし、2 回目はまったく同じコードがモジュールから名前をインポートしようとします。これはどのように機能しますか?

4

4 に答える 4

5

循環インポートを作成しました。そんなことはできません。mainからのインポートは避けてくださいinstall

何が起こっているかというと、インポート中のモジュールは、トップレベル全体が実行されるまで不完全です。その実行中に (直接または間接的に) 元のモジュールを再度インポートしようとする別のモジュールをインポートすると、これは失敗します。元のモジュールのインポートはまだ完了していません。

つまり、循環グラフを作成しています。

start -> scripts.main -> scripts.install
              ^                |
              |                |
               ----------------

パッケージmain内からインポートする必要がないように、コードを再配置する必要があります。scripts

モジュールでインポートを使用するための「ベスト プラクティス」とは何ですか? を参照してください。これを処理する方法に関するいくつかのヒントについては。

于 2012-08-15T17:52:57.593 に答える
3

mainインポートinstallinstallインポートmain:

  • from scripts import mainstart.pyつながる
  • from . import installmain.py つながる
  • from scripts import mainin install.py-- 循環インポート

循環インポートを解決するには、maininstallを 1 つのモジュールに結合するか、両方のモジュールがインポートできる 3 番目のモジュールを作成します。

于 2012-08-15T18:10:44.960 に答える
0

これは、デフォルトの動作をオーバーライドするために使用するパッチです。

import sys
import builtins
import importlib

def _import(name, globals=None, locals=None, fromlist=None, level=0, __import__=__import__):
    """A hack to to make names of imported modules to be available in the parent package before
    they are fully imported. If a module is present in sys.modules event if it's not fully
    imported, it should not be a problem.
    I.e. ``from package import module1, module2`` will create variables ``package.module1`` and
    ``package.module2`` at start of the import, not when it's finished.
    This helps in some situations with circular import.
    """
    module = __import__(name, globals, locals, fromlist, level)
    for attr in fromlist or ():
        sub_module = sys.modules.get(module.__name__ + '.' + attr)
        if sub_module:  # is this a module?
            # if subpackage is already being imported, even if not finished,
            # inject its name into the parent package
            setattr(module, attr, sub_module)
    return module

builtins.__import__ = _import

これをテストするプロジェクトは次のとおりです: https://github.com/warvariuc/python_import_improver

于 2014-03-03T09:45:15.350 に答える
0

これはうまくいくはずです:

start.py:

from scripts import main

スクリプト/main.py:

import install

スクリプト/install.py:

import main
于 2012-08-15T18:03:15.410 に答える