2016-03-23 6 views
0

Во-первых, я создал __init__.py в моей app папкепитон Ошибка импорта: нет модуль с именем приложения

from flask import Flask 

app = Flask(__name__) 
from app import views 

, а затем я создал views.py в той же папке приложения

from app import app 

@app.route('/') 
@app.route('/index') 
def index(): 
    return "Hello, World! 

и, наконец, я создал run.py в другой папке

#!flask/bin/python 
from app import app 
app.run() 

так, моя колба дерево как

/microblog 
    /app 
     /__init__.py 
     /views.py 
    /flask 
    /tmp 
     /run.py 

Но, когда я пытаюсь запустить run.py, я получаю сообщение об ошибке

Traceback (most recent call last): 
File "/home/shubham/Microblog/tmp/run.py", line 2, in <module> 
    from app import app 
ImportError: No module named app 
[Finished in 0.2s with exit code 1] 
[shell_cmd: python -u "/home/shubham/Microblog/tmp/run.py"] 
[dir: /home/shubham/Microblog/tmp] 
[path:  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games] 
+2

Попробуйте переместить 'run.py' из' tmp' под 'microblog'. Я думаю, что это просто проблема «PYTHONPATH»; ваш run.py не может найти ваш модуль приложения. –

+0

Не помещайте свой текстовый редактор. Нам все равно. – MattDMo

+0

#llja Я попробовал, но это дает мне новую ошибку, то есть «объект AttributeError: 'module» не имеет атрибута «route» «теперь, что я могу сделать? –

ответ

0

Ваша проблема заключается в том, что у вас нет четкого понимания о различиях между импортом, именами переменных и пакетами. И как работают импорт.

Когда вы структурируете пакет Python, обычно у вас есть папка с полным набором файлов с setup.py, README и другими сортированными файлами, а затем папкой вашего пакета. Вы могли бы хотеть что-то, что выглядит следующим образом:

├── microblog 
│   ├── __init__.py 
│   ├── server.py 
│   └── views.py 
├── README 
├── MANIFEST.in 
└── setup.py 

Если вы действительно не хотел ставить свои обработчики URL в том же месте, как ваше приложение, вы получили это немного назад, хотя. Вы должны сделать это так:

server.py

from flask import Flask 
from . import views 

app = Flask(__name__) 
app.register_blueprint(views.microblog) 


def run(): 
    app.run(debug=True) 

views.py

from flask import Blueprint 

microblog = Blueprint('microblog', __name__) 

@microblog.route('/') 
@microblog.route('/index') 
def index(): 
    return 'Hello, world!' 

setup.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from setuptools import setup 

setup(
    name='microblog', 
    version='0.1.0', 
    description='My microblog', 
    author='Me', 
    author_email='[email protected]', 
    url='http://my.cool.example.com', 
    packages=[ 
     'microblog', 
    ], 
    entry_points={ 
     'console_scripts': [ 
      'start-my-blog = microblog.server:run' 
     ], 
    }, 
    package_dir={'microblog': 'microblog'}, 
    include_package_data=True, 
    install_requires=['flask', 
    ], 
    license="BSD", 
    zip_safe=False, 
    keywords='', 
    classifiers=[ 
     'Development Status :: 2 - Pre-Alpha', 
     'Intended Audience :: Developers', 
     'License :: OSI Approved :: BSD License', 
     'Natural Language :: English', 
     'Programming Language :: Python :: 3.4', 
    ], 
) 

Теперь вы можете создать себе virtualenv, установить ваше приложение, а затем запустите его:

$ mkvirtualenv microblog 
$ workon microblog 
(microblog) $ python -m pip install -e . 
# a bunch of install happens here, flask & what-not 
$ start-my-blog 

Если вы хотите изменить имя запускаемой команды, вы сделаете это в своем setup.py. Начиная со структурой, подобной этой, вы сэкономите много головных болей в будущем.

+0

За исключением столкновений имен в op. Хотя это хороший способ организовать проект, это не проблема. – davidism

+0

Тем не менее. Уверен, что ОП не может когда-либо столкнуться с именами (очевидно?) Я думаю, что, вероятно, они появятся в будущем. –

Смежные вопросы