2

Pythonコードでは、シェルにコマンドを頻繁に送信し、を使用して応答を読み取ります

import subprocess as S
x = subprocess.Popen('<command>', shell=True, stdout=S.PIPE)
x.stdout.read()

<command>、問題のシェルコマンドはどこにありますか。ただし、この命令がサブプロセスで発行されると、stty sizeたとえばコマンドの場合、シェルは次のように応答します。

stty: stdin isn't a terminal

そして私の命令は空の文字列を返します。http://docs.python.org/library/subprocess#popen-objectsにあるPythonのドキュメントに続いて、次のように置き換えstdout.read()てみましたcommunicate()

x = subprocess.Popen('<command>', shell=True, stdin=S.PIP, stdout=S.PIPE)
x.stdout.read()

しかし、シェルはそれでも同じように応答します。

私の質問:Pythonに標準入力を端末として扱わせるにはどうすればよいですか?

4

1 に答える 1

2

Python が stdin を端末のように扱っていないわけではありません。stdin が端末の場合、Python は端末をそのように扱っている可能性があります。しかし、サブプロセスの標準入力はそうではないかもしれません。2 番目のケースでは、代わりに明示的にパイプを使用しているため、ターミナルではありません。

おそらく、stty にパイプを端末として扱わせることはできませんが、パイプの動作方法を変更することはできません。しかし、とにかく、それはおそらくあなたがやりたいことではありません。

ただし、最初の例は、Python 自体の標準入力が tty の場合に機能するはずです。これは、stty がシェルからそれを継承する必要があるためです。

おそらく、「この命令がサブプロセスで発行されたとき」という意味がよくわかりません。技術的には、init/launchd を除く Un*x システムのすべてがサブプロセスです。

于 2012-06-25T00:57:17.513 に答える