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

时间:2017-06-20 01:40:44

标签: python python-2.7 flask import

__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)

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

解决这个问题。 1:首先要了解两件事情,virtualenv的根目录与您的系统环境有所不同。 Virtualenv将你的项目目录设置为它的root。但是如果你不使用virtualenv,根据我的经验,root将是你的系统目录。因此,在创建__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.py或src / models / user.py中导入时子目录,你不会包括src:

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

答案 1 :(得分: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