4

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
Python:2.6
cvs.exe:1.11

4

2 に答える 2

2
  • 部品を取り外し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 は (標準入力や標準出力からではなく) 端末から直接パスワードを読み取るため、サブプロセスの stdin にパスワードを書き込むことはできません。

代わりに、次のように 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 に匿名でログインします。

于 2009-02-04T11:00:35.707 に答える
0

パスワードなどの入力が必要な外部プログラムを自動化する場合、最善の策はおそらくpexpectを使用することです。

于 2009-02-04T21:50:13.540 に答える