[英]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.py
對app
的引用。 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.server
在impa.tasks
,但我們不回來,此時導入(我們會另有一整圈結束),並繼續導入impa.tasts
直到我們想訪問impa.server.app
,但是我們還沒有做到這一點, impa.server
尚未導入。
如果可能的話,如果未在導入時執行訪問包中另一個模塊的代碼,也將有所幫助(直接作為模塊的一部分調用,而不是在導入完成后將被調用/使用的函數或類中) )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.