質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

2190閲覧

pythonのimportでエラー

KoshiroNomura

総合スコア11

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2018/12/06 05:35

業務で今月からpythonを扱っています。
↓のページの内容を参考にまずは動作を確認しようとしていますが、アプリケーションの実行すらままならない状態です。。。

リンク内容

■環境
windows 7
python 3.7.1
Visual Stdio Code 1.29.1

■python仮想環境作成
・ターミナルにて以下を実行
python -m venv web_api
・コマンドパレットの[Python: Create Terminal]にて、仮想環境のターミナルを起動し、以下を実行
cd web_api
pip install -r requirements.txt

■フォルダ構成

C:\APP\WEB_API │ │ app.py │ settings.py │ __init__.py │ requirements.txt │ │ pip-selfcheck.json │ pyvenv.cfg │ ├─apis │ todo.py │ user.py │ __init__.py │ ├─models │ __init__.py │ ├─Include ├─Lib └─Scripts

■app.py

from flask import Flask import settings from apis import api from models import db # Flask本体 app = Flask(__name__) def configure_app(flask_app: Flask) -> None: # DB接続先情報やSwaggerの表示形式を指定 flask_app.config['SQLALCHEMY_DATABASE_URI'] = settings.SQLALCHEMY_DATABASE_URI flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = settings.SQLALCHEMY_TRACK_MODIFICATIONS flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = settings.SWAGGER_UI_DOC_EXPANSION flask_app.config['RESTPLUS_VALIDATE'] = settings.RESTPLUS_VALIDATE def initialize_app(flask_app: Flask) -> None: # FlaskへAPIやDB情報を登録 configure_app(flask_app) api.init_app(flask_app) db.init_app(flask_app) db.create_all(app=flask_app) def main() -> None: # Flaskを初期化して実行 initialize_app(app) app.run(host='0.0.0.0', debug=settings.DEBUG) if __name__ == '__main__': main()

■setting.py

from os import environ # デバッグモードを有効化 DEBUG = True # Swaggerのデフォルト表示形式をListにする SWAGGER_UI_DOC_EXPANSION = 'list' # Validationの有効化 RESTPLUS_VALIDATE = True # SQL接続情報 # コンテナ側に環境変数として渡すためこの形式で受け取る SQLALCHEMY_DATABASE_URI = 'postgres' #あとで設定する SQLALCHEMY_TRACK_MODIFICATIONS = True

■apis/init.py

from flask_restplus import Api from web_api.apis.todo import todo_namespace from web_api.apis.user import user_namespace # API情報を指定して初期化 api = Api( title='Test API', version='1.0', description='Swaggerを統合したREST APIのサンプル' ) api.add_namespace(todo_namespace) api.add_namespace(user_namespace)

■apis/todo.py

from flask_restplus import Namespace, fields, Resource from web_api.apis import api from web_api.models import ToDo, db # Namespaceの初期化と登録 todo_namespace = Namespace('todo', description='ToDoのエンドポイント') # JSONモデルの定義 todo = todo_namespace.model('ToDo', { 'user_id': fields.Integer( required=True, description='ToDoを登録したユーザーID', example='0' ), 'id': fields.Integer( required=True, description='ToDoのID', example='1' ), 'title': fields.String( required=True, description='ToDoタイトル', example='起きる' ), 'description': fields.String( required=True, description='ToDoの詳細', example='朝7時に起きたい' ) }) @todo_namespace.route('/') class ToDoList(Resource): # todoモデルを利用して結果をパースしてリストで返す @todo_namespace.marshal_list_with(todo) def get(self): """ 一覧取得 """ return ToDo.query.all() @todo_namespace.marshal_with(todo) @todo_namespace.expect(todo, validate=True) def post(self): """ ToDo登録 """ # ちょっとやっかいなので実装はまた今度 pass @todo_namespace.route('/<int:todo_id>') class ToDoController(Resource): # todoモデルを利用して結果をパースして単体で返す @todo_namespace.marshal_with(todo) def get(self, todo_id): """ ToDo詳細 """ # ただし1個も見つからなかったら404を返す return ToDo.query.filter(ToDo.id == todo_id).first_or_404() def delete(self, todo_id): """ ToDo削除 """ # 見つからなかったときの処理してないけど許して target_todo = ToDo.query.filter(ToDo.id == todo_id).first() db.session.delete(target_todo) return {'message': 'Success'}, 200

■apis/user.py

from flask_restplus import Namespace, fields, Resource from web_api.apis import api # Namespaceの初期化と登録 from web_api.apis.todo import todo from web_api.models import User, db, ToDo user_namespace = Namespace('users', description='ユーザー関連のエンドポイント') # JSONモデルの定義 user = user_namespace.model('User', { 'id': fields.Integer( required=True, description='', example='0' ), 'name': fields.String( required=True, description='', example='Aruneko' ), 'email': fields.String( required=True, description='', example='aruneko@example.com' ) }) @user_namespace.route('/') class UserList(Resource): @user_namespace.marshal_list_with(user) def get(self): """ ユーザー一覧 """ return User.query.all() @user_namespace.marshal_with(user) @user_namespace.expect(user) def post(self): """ ユーザー登録 """ # ちょっとやっかいなので実装はまた今度 pass @user_namespace.route('/<int:user_id>') class UserController(Resource): @user_namespace.marshal_with(user) def get(self, user_id): """ ユーザー詳細 """ return User.query.filter(User.id == user_id).first_or_404() def delete(self, user_id): """ ユーザー削除 """ target_user = User.query.filter(User.id == user_id).first() db.session.delete(target_user) return {'message': 'Success'}, 200 @user_namespace.route('/<int:user_id>/todo') class ToDoByUser(Resource): @user_namespace.marshal_list_with(todo) def get(self, user_id): """ ユーザーごとのToDo取得 """ return ToDo.query.filter(ToDo.user_id == user_id).all()

■models/init.py

from flask_sqlalchemy import SQLAlchemy # SQLAlchemyの初期化 db = SQLAlchemy() # Userスキーマの定義 class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.Text, nullable=False) email = db.Column(db.Text, nullable=False) # ToDoスキーマの定義 class ToDo(db.Model): __tablename__ = 'todo' id = db.Column(db.Integer, nullable=False, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) title = db.Column(db.Text, nullable=False) description = db.Column(db.Text, nullable=False)

発生している問題・エラーメッセージ

Visula Stdio Codeのデバッグを実行すると、
以下のエラーメッセージが出力され、アプリケーションを起動できません。

* Serving Flask app "app.py" * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off Usage: python -m flask run [OPTIONS] Error: While importing "app", an ImportError was raised: Traceback (most recent call last): File "c:\app\web_api\lib\site-packages\flask\cli.py", line 235, in locate_app __import__(module_name) File "c:\app\web_api\app.py", line 4, in <module> from apis import api File "c:\app\web_api\apis\__init__.py", line 3, in <module> from web_api.apis.todo import todo_namespace File "C:\app\web_api\apis\__init__.py", line 3, in <module> from web_api.apis.todo import todo_namespace File "C:\app\web_api\apis\todo.py", line 3, in <module> from web_api.apis import api ImportError: cannot import name 'api' from 'web_api.apis' (app\web_api\apis\__init__.py)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このディレクトリ構造で、web_apiをカレントディレクトリにするなら、apisパッケージ中のコードのfrom web_api.apis(以下略)はぜんぶfrom apis(以下略)が正しい。


appをロードするのにapisをインポートしているのでまずapisパッケージがロードされる必要があって、apisパッケージがロードされるためにapis/__init__.pyが実行される。
その中でapis/todoがインポートされているのでapis/todo.pyが実行される。
ところがその中でfrom apis import apiと書かれていて堂々巡りになっているのがおかしい。

実のところapis/todo.pyの中でapiは使ってないので、todo.pyとの冒頭でfrom apis import apiは不要で、削除してよい
apis/user.pyも同様。


"Visula Stdio Codeのデバッグを実行すると"だけだと、どう実行されているのかわからないので、このあたりまででしょうか。

投稿2018/12/06 06:59

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoshiroNomura

2018/12/06 08:36

ありがとうございました!! エラーがなくなりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問