微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

派生子stream程,期望控制台input没有阻止?

我正在尝试通过调用cvs.exe进程从Python进行CVSlogin。 当手动调用cvs.exe时,会向控制台输出一条消息,然后等待用户input密码

当用subprocess.Popen调用它时,我注意到了这个调用块。 代码

subprocess.Popen(cvscmd,shell = True,stdin = subprocess.PIPE,stdout = subprocess.PIPE,stderr = subprocess.PIPE)

我认为它阻塞,因为它正在等待input,但我的期望是,调用Popen将立即返回,然后我可以调用subprocess.communicate()input实际的密码。 我怎样才能做到这一点,并避免阻止Popen?

操作系统:Windows XP

Python:2.6

cvs.exe:1.11

在C#和C ++之间传输图像数据

任何人都知道翻译时区描述的来源?

以编程方式将CFF字体转换为OpenType字体

获取与我的窗口重叠的所有窗口

为什么GetFileAttributesW(L“C:”)返回FILE_ATTRIBUTE_REPARSE_POINT?

PHP错误上传文件

安装Rcartogram软件包 – 错误消息

在Base类中实现一个函数的最有效的方法

Grunt和CasperJStesting – 在Windows上不能退出或终止(只能用CTRL + C)

从string获得LCID

删除shell=True部分。 你的外壳与它无关。 使用shell=True是麻烦的常见原因。

使用cmd的参数列表。

例:

cmd = ['cvs','-d:pserver:[email protected].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),stdout=subprocess.PIPE stderr=subprocess.STDOUT) return p

这对我有用。 调用

login_to_sourceforge_cvs('bayonne')

将匿名登录到bayonne项目的cvs。

如果你正在自动化需要输入的外部程序 – 比如密码 – 你最好的办法就是使用pexpect 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐