簡體   English   中英

從同一目錄導入模塊時,模塊“ a”沒有屬性“ b”

[英]Module 'a' has no attribute 'b' while importing module from same directory

我的Python項目中具有以下目錄結構:

    - dump_specs.py
    /impa
        - __init__.py
        - server.py
        - tasks.py

我對循環引用有疑問。 dump_specs.py需要從server.pyapp的引用。 server.py是Flask應用程序,需要引用tasks.py celery任務。 所以dump_specs.py看起來像:

#!/usr/bin/env python3

import impa.server

def dump_to_dir(dir_path):
    # Do something
    client = impa.server.app.test_client()
    # Do the rest of things

impa/server.py看起來像:

#!/usr/bin/env python3

import impa.tasks

app = Flask(__name__)

# Definitions of endpoints, some of them use celery tasks -
# that's why I need impa.tasks reference

impa/tasks.py

#!/usr/bin/env python3

from celery import Celery

import impa.server

def make_celery(app):
    celery = Celery(app.import_name,
                broker=app.config['CELERY_BROKER_URL'],
                backend=app.config['CELERY_RESULT_BACKEND'])
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)

    celery.Task = ContextTask
    return celery

celery = make_celery(impa.server.app)

當我嘗試使用./dump_specs.py轉儲規范時,出現錯誤:

./dump_specs.py specs
Traceback (most recent call last):
  File "./dump_specs.py", line 9, in <module>
    import impa.server
  File "/build/impa/server.py", line 23, in <module>
    import impa.tasks
  File "/build/impa/tasks.py", line 81, in <module>
    celery = make_celery(impa.server.app)
    AttributeError: module 'impa' has no attribute 'server'

而且我不明白怎么了。 有人可以解釋發生了什么以及如何消除此錯誤嗎?

如果我設法在主機上正確重現您的問題,它應該可以幫助您將import impa.tasks插入到dump_specs.py 上方的 import impa.server

模塊之間相互依賴的方式,加載順序很重要。 IIRC(文檔中對加載機制進行了更詳細的描述),當您首次嘗試導入impa.server ,它將在第23行嘗試導入impa.tasks ,但是impa.server導入尚未完成。 import impa.serverimpa.tasks ,但我們不回來,此時導入(我們會另有一整圈結束),並繼續導入impa.tasts直到我們想訪問impa.server.app ,但是我們還沒有做到這一點, impa.server尚未導入。

如果可能的話,如果未在導入時執行訪問包中另一個模塊的代碼,也將有所幫助(直接作為模塊的一部分調用,而不是在導入完成后將被調用/使用的函數或類中) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM