【问题标题】:Does __init__.py have to be in every directory of python application?__init__.py 是否必须在 python 应用程序的每个目录中?
【发布时间】:2017-11-22 08:57:21
【问题描述】:

__init__.py 用于将磁盘上的目录标记为 Python 包目录。假设我们有文件

py/src/__init__.py
py/src/user.py

py 在你的路径上,你可以将 user.py 中的代码导入为:

import src.module

from src import user

如果我们删除 __init__.py 文件,Python 将不再在该目录中查找子模块,因此尝试导入模块将失败。

但在我的应用程序上,__init__.py 不起作用。

__init__ .py

__all__ = ['models', 'common']
from src.models.user import User    
from src.models.post import Post
from src.models.blog import Blog

当我运行 python app.py 时

错误:

Traceback (most recent call last):
  File "src/app.py", line 5, in <module>
    from src.models.user import User
ModuleNotFoundError: No module named 'src'

App.py 文件:

import os
import sys

from flask import Flask, render_template, request, session 
from src.models.user import User 

app = Flask(__name__) #'__main__'

@app.route('/') # 'OUrsite.com/api/'
# def hello world ot test the first api call
def hello_method():
    return render_template('login.html')

@app.route('/login')
def login_user():
    email = request.form['email']
    password = request.form['password']
    if User.login_valid(email, password):
        User.login(email)
    return render_template("profile.html", email=session['email'])

if __name__ == '__main__':
    app.run(port = 9100)

我错过了什么吗?

【问题讨论】:

    标签: python python-2.7 flask import


    【解决方案1】:

    你没有先导入src

    import src
    
    __all__ = ['models', 'common']
    from src.models.user import User
    from src.models.post import Post
    from src.models.blog import Blog
    

    如果这是src/__init__.py,您可以使用相对导入:

    from __future__ import absolute_import
    
    from .models.user import User
    from .models.post import Post
    from .models.blog import Blog
    

    【讨论】:

    • 未来会怎样。是的,它在 src 中,我应该也上传我的 app.py 文件
    【解决方案2】:

    有两点需要理解。

    virtualenv的根目录和你的系统环境有区别。
    Virtualenv 将您的项目目录设置为它的根目录。但如果您不使用 virtualenv,根目录将是您的系统目录(至少,根据我的经验)。
    因此,在创建 __init__py 时,请记住,如果没有 virtualenv 或者您没有导入任何内容,则它可以为空。

    简单的__init_.py例子:

    # in your __init__.py
    from file import File
    
    # now import File from package
    from package import File
    

    我的__init__.py

    import src 
    from src import *
    from .models.user import User
    from .models.post import Post
    from .models.blog import Blog
    

    并且当你在同一目录和子目录下的app.pysrc/models/user.py中导入时,你不能包含src

    from models.user import User 
    from common.database import Database
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 2011-08-07
      • 2019-10-03
      • 2020-07-31
      • 2014-08-08
      • 2018-01-22
      • 2021-11-10
      • 2013-06-01
      • 2015-02-26
      相关资源
      最近更新 更多