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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3893閲覧

subprocess.runで実行する.pyに変数を渡したい

mamanmama

総合スコア11

Flask

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/03/25 02:30

編集2020/03/25 07:21

Flaskでwebサイトを構築中です。

1.あるページ(a.html)のフォームに入力し、ボタンで実行
2.入力データをb.pyで受け取り、変数に格納
2.その変数をc.pyに引渡して実行
3.実行結果をd.htmlで出力

という流れを実現したいと考えています。

※それぞれ、該当箇所のみ抜粋しています。

a

1 <form action="/d" method="POST"> 2 <p>ida<input type="text" name="neid"></p> 3 <p>idb<input type="text" name="snid"></p> 4 <p>idc<input type="text" name="noid"></p> 5 <p><button class="oshimasu">button</button></p> 6 </form>

b

1@app.route('/d', methods=['POST']) 2def confirm(): 3 if request.method == 'POST': 4 neres = request.form["neid"] 5 snres = request.form["snid"] 6 nores = request.form["noid"] 7 proc = subprocess.run(['python','c.py'], stdout=PIPE, stderr=PIPE, text=True) 8 res = proc.stdout 9 return render_template('d.html', response = res)

c

1import b 2 3url = f'https://www.humuhumu/{neres}/hogehoge/{snres}/satesate/{nores}/houhou' 4 5response = requests.get(url, params=param, headers=headers) 6 7print(response)

d

1 <p>{{ response }}</p>

b.pyの「subprocess.run」行を抜き、d.htmlでそれぞれの変数に格納したデータを表示することは
成功しています。
また、入力フォームを用意せずにボタンを押すことでsubprocess.runでc.pyを実行し、その結果を
d.htmlに表示することにも成功しています。

したがって、subprocessに変数を渡せていないものと考えています。煮詰まりました。
input等を追加したりしてみたのですが…

よろしくお願いいたします。

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

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

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

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

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

yamap55

2020/03/25 03:31

一応確認ですが「その変数をb.pyに引渡して実行」ができないという質問であってますでしょうか? あっている場合↓コードは特に変更せずに実行しているという事で良いでしょうか? proc = subprocess.run(['python','b.py'], stdout=PIPE, stderr=PIPE, text=True) ↓のように配列に値を設定してみても渡せなかったという事でしょうか? proc = subprocess.run(['python','b.py', nres], stdout=PIPE, stderr=PIPE, text=True)
mamanmama

2020/03/25 07:20

ご確認ありがとうございます。 質問はご指摘の通りです。言葉足らずで申し訳ございません。 若干内容に誤りがあり、修正しました。 以下を試しましたが、d.htmlに結果は出力されませんでした。 ・proc = subprocess.run(['python','b.py'], stdout=PIPE, stderr=PIPE, text=True) ・proc = subprocess.run(['python','b.py', neres, snres, nores], stdout=PIPE, stderr=PIPE, text=True)
yamap55

2020/03/26 03:30

Flaskを通さず、`python b.py neres snres nores` を行った場合はどのような結果になるのでしょうか?(neres snres noresはそれぞれ適切な値に置換して実行お願いします。)
mamanmama

2020/03/26 05:26 編集

c.pyがそのままでは動作しませんでしたが、 c.pyの中身を修正したところ、'python c.py 'neres' 'snres' 'nores'で正常に動作しました。 (neres snres noresは実際の値にしました。) c.pyには以下を追記し、url内の変数を書き換えました。  import sys  args = sys.argv url = f'https://www.humuhumu/{args[1]}/hogehoge/{args[2]}/satesate/{args[3]}/houhou' となると、subprocess.run[]内の指定方法が誤っているものと推測しますが、 その先に到達できていません…
yamap55

2020/03/26 07:04

質問内容と重複しますが再度確認します。 bは↓でc.pyを呼び出す proc = subprocess.run(['python','c.py'], stdout=PIPE, stderr=PIPE, text=True) c.pyの中身は↓ import sys args = sys.argv url = f'https://www.humuhumu/{args[1]}/hogehoge/{args[2]}/satesate/{args[3]}/houhou' response = requests.get(url, params=param, headers=headers) print(response) という事で良いでしょうか?subprocessで呼び出すという事は、flask上から動かすのもコンソールから動かすのも、引数が同じであれば基本的には同じ動きをするはずですので、コメントで言われている「c.pyがそのままでは動作しませんでしたが」という事はflask上からでもうまく動きません。
mamanmama

2020/03/26 09:11 編集

内容は仰る通りでございます。 c.pyの中身を修正後、コンソールから正常動作を確認しました。 ただ申し訳ないのがc.py修正後、flask上に値を入れた場合も成功しました。詳細は以下です。 コンソールで実行したコマンド「python c.py 'neres' 'snres' 'nores'」はユーザーが入力する実際の値を 入れました。 例としてa.htmlのフォームにそれぞれ以下の値を入れたと仮定し、 neres = 'aaaaa' snres = 'bbbbb' nores = 'ccccc' コマンドは「python c.py 'aaaaa' 'bbbbb' 'ccccc'」で実行しました。 この場合、c.py内に記述したurlにそれぞれの値が正常に埋め込まれ、そのURLに アクセスして情報取得できていることを確認しました。 同様にflaskのb.py上で以下のように記述しました。  「proc = subprocess.run(['python','curl.py','aaaaa','bbbbb','ccccc'], stdout=PIPE, stderr=PIPE, text=True)」 この場合もc.pyが正常に実行され、d.html上に結果が表示されました。 解決していないのが、「proc = subprocess.run(['python','c.py','neres','snres','nores'], stdout=PIPE, stderr=PIPE, text=True)」のように変数とした場合です。 ユーザーが入力した値をurlに埋め込みたいため、ここを変数指定したいと考えております。 subprocessで変数指定した場合、c.pyのurlに関してもargsは使えないだろうと思い、試行錯誤中です。 長くなり申し訳ございません。
yamap55

2020/03/27 01:23

> subprocessで変数指定した場合、c.pyのurlに関してもargsは使えないだろうと思い、試行錯誤中です。 何故そう思ったのかよくわからないのですが、このコメントを元に回答を記載致します。
guest

回答1

0

ベストアンサー

まずsubprocessでc.pyを実行する際に引数を渡します。

b

1proc = subprocess.run(['python','c.py', neres, snres, nores], stdout=PIPE, stderr=PIPE, text=True)

c.pyではコメントに記載があるように引数から値を受け取りそれを使用する事で実現は可能かと思います。

c

1import sys 2args = sys.argv 3url = f'https://www.humuhumu/{args[1]}/hogehoge/{args[2]}/satesate/{args[3]}/houhou' 4response = requests.get(url, params=param, headers=headers) 5print(response)

下記のコメント欄での記載についてです。

subprocessで変数指定した場合、c.pyのurlに関してもargsは使えないだろうと思い

subprocessはその名の通り別のプロセスでコマンドを実行します。
python云々は関係なくコンソール上で実行した場合と同じです。
よって、subprocessで実行するコマンド ['python','c.py', neres, snres, nores]

neres='aaa'
snres='bbb'
nores='ccc'

とした場合には python c.py aaa bbb ccc として実行されます。
よって、c.pyの中ではsys.argvで引数を取得する事で、それぞれの値を取得可能となります。

投稿2020/03/27 01:31

yamap55

総合スコア1376

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

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

mamanmama

2020/03/27 01:48

正常動作を確認いたしました。 argsが使えないというのは単なる愚かな思い込みでした。 稚拙な質問への、ご丁寧な対応に感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問