最初的说明:我知道有很多此类关于python的文章,但我已经尝试了许多解决方案,但它们对我没有用。
文件结构:
/nickdima
__init__.py
/test_pong
__init__.py
pong.py
/ nickdima / __ init __。py:
from flask_socketio import Socketio
socker = SocketIO()
from test_pong import pong
def create_app():
app = Flask(__name__)
socker.init_app(app)
return app
/nickdima/test_pong/pong.py
from __main__ import socker
@socker.on('connect')
def handle_connect():
print('connected')
当我在Heroku上运行此代码时,出现错误:
from __main__ import socker
ImportError: cannot import name 'socker'
我相当确定这与循环导入有关,但是我无法解决。
我尝试放入:from test_pong import pong
在create_app()
函数内部以“本地延迟导入”,但无济于事,我得到相同的错误cannot import name 'socker'
答案 0 :(得分:2)
好的,所以在进一步检查之后,我建议:
/nickdima
__init__.py
socker.py
/test_pong
__init__.py
pong.py
/nickdima/socker.py
from flask_socketio import Socketio
socker = SocketIO()
/ nickdima / __ init __。py:
from nickidima.socker import socker
from nickidima.test_pong import pong
def create_app():
app = Flask(__name__)
socker.init_app(app)
return app
/nickdima/test_pong/pong.py
from nickidima.socker import socker
@socker.on('connect')
def handle_connect():
print('connected')
这样,您将不再具有循环依赖项!
导入相对于放置nickidima
的根目录。我不确定Heroku如何进行这种导入(实际上我从未使用过Heroku),但是希望您能理解这个想法,并能够根据您的需要进行调整。
最重要的一课:循环依赖几乎总是不良设计的标志,几乎总是可以用非循环依赖来代替。而当他们能够做到时:
旁注::我正在遵循您的命名约定(socker?),但认真的说,您应该修复它。 :)