gpt4 book ai didi

python - 期望控制台输入而不会阻塞的 Spawn 子进程?

转载 作者:可可西里 更新时间:2023-11-01 14:21:44 24 4
gpt4 key购买 nike

我正在尝试通过调用 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=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。

关于python - 期望控制台输入而不会阻塞的 Spawn 子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com