ブロックせずにコンソール入力を期待するサブプロセスを生成しますか?
-
21-08-2019 - |
質問
cvs.exe プロセスを呼び出して、Python から CVS ログインを実行しようとしています。cvs.exe を手動で呼び出すと、コンソールにメッセージが出力され、ユーザーがパスワードを入力するのを待ちます。
subprocess.Popen で呼び出すと、呼び出しがブロックされることに気付きました。コードは
subprocess.Popen(cvscmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
入力を待っているためブロックしていると思いますが、私の期待は、Popen を呼び出すとすぐに戻り、subprocess.communicate() を呼び出して実際のパスワードを入力できることです。この動作を実現し、Popen でのブロックを回避するにはどうすればよいですか?
OS:Windows XP
パイソン:2.6
cvs.exe:1.11
解決
- を削除します。
shell=True
一部。あなたのシェルはそれとは何の関係もありません。使用するshell=True
トラブルの一般的な原因です。 - cmd のパラメータのリストを使用します。
例:
cmd = ['cvs',
'-d:pserver:anonymous@bayonne.cvs.sourceforge.net:/cvsroot/bayonne',
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
私のシステムではこれはブロックされません (スクリプトは実行を続けます)。ただし、CVS は (標準入力や出力からではなく) ターミナルから直接パスワードを読み取るため、 できない パスワードをサブプロセスの標準入力に書き込むだけです。
代わりに、次のように CVSROOT 仕様の一部としてパスワードを渡すこともできます。
:pserver:<user>[:<passwd>]@<server>:/<path>
つまり、SourceForge プロジェクトにログインする関数:
import subprocess
def login_to_sourceforge_cvs(project, username='anonymous', password=''):
host = '%s.cvs.sourceforge.net' % project
path = '/cvsroot/%s' % project
cmd = ['cvs',
'-d:pserver:%s:%s@%s:%s' % (username, password, host, path),
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE
stderr=subprocess.STDOUT)
return p
これは私にとってはうまくいきます。電話をかける
login_to_sourceforge_cvs('bayonne')
Bayonne プロジェクトの CVS に匿名でログインします。
他のヒント
あなたが入力を必要とする外部プログラムを自動化する場合 - パスワードのように - あなたの最善の策は、おそらく使用することです pexpectするます。
所属していません StackOverflow