date: 2018-07-05
tags: python
The relative importing has always been painful in python. For example, we are writing a web app using Flask. The file structure is like following:
\root
run.py
\views
blueprint.pyTo use websocket, we have chosen the flask-socketio. In the run.py and our blueprint file, we all need the socketio variable. It is natural for one to write the following code:
In run.py
... ...
from flask-socketio import SocketIO
... ...
socketio = SocketIO()
def register_blueprint(app):
... ...
app = Flask(__name__)
register_blueprint(app)
socketio.init_app(app)
... ...And in blueprint.py
from ..run import socketio
... ...
@socket.on('message'):
... ...But this would trigger:
Error: attempted relative import beyond top-level packageWe need to move the variable socketio to __ init__.py. Now the file structure is:
\root
run.py
\views
__init__.py
blueprint.pyIn __ init__.py:
socketio = SocketIO()In run.py
from views import socketioIn blueprint.py
from . import socketioProblem solved!