我试图通过调用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?
操作系统:Windows XP
Python:2.6
cvs.exe:1.11
答案 0 :(得分:2)
shell=True
部分。你的shell与它无关。使用shell=True
是导致问题的常见原因。示例:
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。
答案 1 :(得分:0)
如果要自动化需要输入的外部程序(如密码),最好的办法是使用pexpect。