无法导入名称“ socker”

时间:2018-09-08 16:50:18

标签: python

最初的说明:我知道有很多此类关于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 pongcreate_app()函数内部以“本地延迟导入”,但无济于事,我得到相同的错误cannot import name 'socker'

1 个答案:

答案 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?),但认真的说,您应该修复它。 :)