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

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

ただいまの
回答率

90.76%

  • Python 3.x

    5341questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 653

simasimaa

score 30

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

#python test.py
print("test")
s=input()
print(s)
print("finish")


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

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/09 22:38

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

    キャンセル

  • 2017/11/09 22:52

    Pexpect 4.0 から実験的にサポートしているようです。
    詳しくはドキュメントを参照してください。
    https://pexpect.readthedocs.io/en/stable/overview.html#windows

    キャンセル

  • 2017/11/09 23:03

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

    キャンセル

checkベストアンサー

0

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

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

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

exc.py

import os

os.system("python3 test.py < hoge.txt")


test.py

print("test")
s=input()
print(s)
print("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

import os

for i in range(10):
    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/22 10:54

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5341questions

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