Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does __init__.py have to be in every directory of python application?

__init__.py are use to mark directories on disk as a Python package directories. lets say we have the files

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

and py is on your path, you can import the code in user.py as:

import src.module

or

from src import user

If we remove the __init__.py file, Python will no longer look for submodules inside that directory, so attempts to import the module will fail.

But on my app the __init__.py is not working.

__init__ .py

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

When I run python app.py

errors:

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 file:

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)

Am I missing something?

like image 454
farhan Avatar asked Jun 20 '17 01:06

farhan


2 Answers

There are two things to understand.

There is a difference in root directory of virtualenv and your system environment.
Virtualenv sets your project dir to it's root. But in case you are not using virtualenv, the root would be your system directory (at least, in my experience).
So, while creating __init__py, keep in mind that, if there is no virtualenv or you haven't imported anything, it can be empty.

simple __init_.py examples:

# in your __init__.py
from file import File

# now import File from package
from package import File

My __init__.py:

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

And when you import in app.py or src/models/user.py which is in a same directory & subdirectory, you shall not include src:

from models.user import User 
from common.database import Database
like image 58
farhan Avatar answered Nov 12 '22 15:11

farhan


You didn't import src first.

import src

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

If this is src/__init__.py, you can use a relative import:

from __future__ import absolute_import

from .models.user import User
from .models.post import Post
from .models.blog import Blog
like image 20
chepner Avatar answered Nov 12 '22 15:11

chepner