__init__.py 是否必须在 python 应用程序的每个目录中?

far*_*han 5 python import flask python-2.7

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

py/src/__init__.py
py/src/user.py
Run Code Online (Sandbox Code Playgroud)

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

import src.module
Run Code Online (Sandbox Code Playgroud)

或者

from src import user
Run Code Online (Sandbox Code Playgroud)

如果我们删除该__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
Run Code Online (Sandbox Code Playgroud)

当我运行 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'
Run Code Online (Sandbox Code Playgroud)

应用程序.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)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

far*_*han 6

有两件事需要理解。

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
Run Code Online (Sandbox Code Playgroud)

我的__init__.py

import src 
from src import *
from .models.user import User
from .models.post import Post
from .models.blog import Blog
Run Code Online (Sandbox Code Playgroud)

当您导入app.pysrc/models/user.py导入同一目录和子目录时,不应包含src

from models.user import User 
from common.database import Database
Run Code Online (Sandbox Code Playgroud)