2

一部のシェル スクリプトでは、シェルを実行するために「はい」を確認する必要があります。簡単な方法は、次のように「はい」とパイプを使用することです。

yes | test.py

その後、「はい」と答えなくても、シェルスクリプトを自動的に実行できます。今日、os.system("yes|**.sh")を試してPythonでこれを使用すると、エラーが発生しました。

ここに私のtest.pyファイルがあります:

import os
def f():
    cmd1 = "yes | read "          
    os.system(cmd1)
f()

python test.py と入力してシェルで実行します。障害情報は次のとおりです: yes: 標準出力: 壊れたパイプ yes: 書き込みエラー

しかし、シェルで「yes | read」と入力すると、うまく機能します。誰か教えてください。

4

2 に答える 2

0

シェルで実行するサブプロセスはyes、パイプラインが閉じられた後もパイプへの書き込みを試行し続けると「パイプが閉じられました」というシグナルを受け取りますが、一部のシェルはこのエラーをトラップして無視するように構成されているため、エラーは表示されません。メッセージ。いずれにせよ無害です。

ただし、このコードで何を達成したいかは不明です。を実行するサブプロセスはすぐに終了readするため、サブプロセスで実行してもまったく意味がありません。read

繰り返し印刷したい場合yesは、Python 自体で簡単に実行できます。

while True:
    print('yes')

独自のプログラムをテストする場合は、コードを変更して、デバッグ フラグを有効にして実行するときにインタラクティブな入力を必要としないようにすることができます。とにかく、それがあなたの目標である場合、あなたの現在のアプローチは裏返しです。サブプロセス パイプラインが実行されている間、親 (Python) プロセスは待機します。

(大人になると、入力をコマンドライン引数として渡す方法がわかるでしょう。これにより、基本的に、スクリプトで対話型のプロンプトが必要になることはありません。これは、多くの理由でより優れた設計ですが、コードのテストを自動化できるためです。確かにそのうちの1つです。)

于 2016-07-23T07:19:25.183 に答える