python – Spawn子进程,期望控制台输入没有阻塞?

我试图通过调用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

解决方法:

>删除shell = True部分.你的shell与它无关.使用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.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...