ブロックせずにコンソール入力を期待するサブプロセスを生成しますか?

StackOverflow https://stackoverflow.com/questions/510751

  •  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するます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top