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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

698閲覧

flask(app.py)で以下のようなディレクトリ内にあるpythonファイルの関数を使うことが出来ないです

t.t.t.

総合スコア7

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/19 05:56

実現したいこと

./
├─ app.py ..... 実行ファイル
└─ codes/
/└─ test.py
/└─ init.py

app.pyの中でcodes中にあるtest.pyに記載している関数を実行したいです

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

app.pyでfrom codes.test import sampleを行うと、sampleのみを呼び出したいのですが、それ以下の(for n in tqdm~)部分も走ってしまいます。

その結果、実行に時間がかかってしまいtime outになってしまいます。

前提

test.pyの中身は簡単化してるのでおかしな部分がありますが、
実際に単体でコードを実行すると正しい結果が返ってくるようになってます。

該当のソースコード

python

1#app.py 2from codes.test import sample 3 4app = Flask(__name__) 5app.config['JSON_AS_ASCII'] = False 6 7@app.route('/', methods=['GET','POST']) 8def hello(): 9 return sample() 10 11if __name__ == "__main__": 12 app.run(debug=True)

python

1#test.py 2 3def sample() 4 return "hello world" 5 6 7for n in tqdm(range(0, num)): 8 try: 9 resultList = joblib.Parallel(n_jobs=12, verbose=3)( [joblib.delayed(get_url)(i) for i in range(n*a,(n+1)*a) ]) 10 url_list.extend(resultList) 11 except: 12 pass

試したこと

app.pyで"from codes.test import sample"を実行するとプログレスバー(tqdmによるもの)が表示されるため、
test.py自体が実行されてしまっていると考え、コードを中断せずに待ってみましたが、
一向にプログレスバーが0%から動きませんでした。(通常test.pyは5分程度で終了します)

また、init.pyには以下のような記述を試しましたが、いずれも結果は変わりませんでした。

python

1#__init__.py 2from . import test

python

1#__init__.py 2from .test import sample

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

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

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

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

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

guest

回答1

0

ベストアンサー

import したモジュールのトップレベルに記述されている内容が実行されてしまうのはpythonの仕様ですので、変更できません。

import時に動作させたくないのであれば、 for文の部分を削除しましょう。

test.pyののものを実行したときには動作させたいということであれば、直接起動時にだけ実行されるように分岐「if __name__=="__main__":」を使いましょう。

for文の部分を任意のタイミングで実行したのであれば、これを関数化しましょう。

投稿2023/05/19 06:19

編集2023/05/19 07:34
TakaiY

総合スコア13176

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

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

t.t.t.

2023/05/19 06:25

ご回答ありがとうございます。 if name=="main":以下に記述するコードはtest.pyをimportしたときに実行するものでしょうか??
TakaiY

2023/05/19 07:39

すみません。markdownでちゃんと表示されるようにするのをわすれていて、そこのところの記述がおかしくなっていました。回答修正しています。 >「if __name__=="__main__":」以下に記述するコードはtest.pyをimportしたときに実行するものでしょうか 逆です。 inportすると、トップレベルに書いたものが実行されます。トップレベルというのは、簡単に言えば行頭から記述されている式やブロックなどです。 「if __name__=="__main__":」も実行されますが、 この条件はimport時にはfalseになるので、以下のブロックは実行されなくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問