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

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

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

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

Q&A

解決済

2回答

2939閲覧

pythonで外部プログラムを動かして標準入力を与える

simasimaa

総合スコア41

Python 3.x

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

0グッド

0クリップ

投稿2017/09/20 18:42

pythonでコマンドを動かし、外部のプログラムを動かしたいです。その際例えば

python

1#python test.py 2print("test") 3s=input() 4print(s) 5print("finish")

のように途中で標準入力を要する場合どのように書けばいいでしょうか

python

1import os 2os.system("python test.py")

test.pyを自動で何度も動かすため手で入力するのは避けたいと思っています

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

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

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

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

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

guest

回答2

0

Python からコマンドを実行して、対話型インタフェース(パスワードを入力したり、yes/no に答えたり等)を自動応答させたいという認識でよいですか?

できれば対話型インタフェースを使わない方法(別に用意されたAPIを使ったり、オプション指定したり等)を探してみてください。

どうしても選択肢が無い場合は、Pexpect というライブラリを使うのがよいと思います。UNIX/Linux で古くから使われている Expect を模したものです。Pexpect は簡単に言うと特定の文字が表示されるのを待ち、それが来たら用意された文字列を送信する…といった操作を自動化します。たとえば、"login:" という文字が来たら "root"、"Password:" と来たら "adminadmin" と入力するといった具合です。

投稿2017/09/20 19:14

miyahan

総合スコア3095

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

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

rev_timo

2017/11/09 13:38

miyahanさん Pexpectはwindowsの場合pexpect.spawnが使えないですよね。 それで、pexpect.popen_spawn.PopenSpawnやpexpect.fdpexpect.fdspawnを使っても 【AttributeError: 'module' object has no attribute 'popen_spawn'】になっていることは分かりますか?
rev_timo

2017/11/09 14:03

miyahanさん ありがとうございます。 4.0にもダメでした、他の方法とかございますか【可能であれば】。
guest

0

ベストアンサー

全部自動化するならあらかじめ入力内容をテキストファイルに書き出すということですよね?

だとすると、pythonではなく、シェルのリダイレクトの問題ですね。

シェルの入出力制御あれこれ

exc.py

lang

1import os 2 3os.system("python3 test.py < hoge.txt")

test.py

lang

1print("test") 2s=input() 3print(s) 4print("finish")

hoge.txt

piyo

シェルで実行

$ python3 exc.py test piyo finish

##追記

複数回実行したいということでしたね。追記させていただきます。

いろいろ方法は考えられますが、test.pyを変更しない場合は、例えば10回行うなら、hoge0.txt〜hoge9.txtと入力ファイルを10個分用意して(以下では、各ファイルにはpiyo0〜piyo9が入っているとします。)、それをexc.pyのほうでforで回すという手があります。

ファイルを用意するのは面倒かもしれませんけど、てっとり早い方法です。

exc2.py

lang

1import os 2 3for i in range(10): 4 os.system("python3 test.py < hoge"+str(i)+".txt")

ちなみにファイルの数が合わなくてもos.systemは例外を出さないのでこのままで大丈夫でしょう。

$ python3 exc2.py test piyo0 finish test piyo1 finish ・ ・ ・ finish test piyo9

投稿2017/09/20 19:11

編集2017/09/20 19:32
namnium1125

総合スコア2043

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

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

simasimaa

2017/09/22 01:54

動かしたいOSSがあり、それが途中でコマンド入力(一文字)を要求してきます とりあえずこのやりかたでできるかやってみます。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問