繁体   English   中英

无法导入名称“ socker”

[英]Cannot import name 'socker'

最初的注意事项:我知道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()函数内部的from test_pong import pong到本地“延迟导入”,但无济于事,我得到同样的错误cannot import name 'socker'

好的,所以在进一步检查之后,我提出以下建议:

/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?),但认真地,您应该修复它。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM