传递`echo t | `作为`subprocess.check_output`中的arg

时间:2012-11-22 12:10:32

标签: python batch-file subprocess

我是Python新手。我对以下问题感到兴奋。

我使用python脚本中的subprocess.check_output调用了一个exe。

res = subprocess.check_output(["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], stderr=subprocess.STDOUT)

在命令提示符下执行脚本时,我收到一条输入输入的提示信息,

(R)eject, accept (t)emporarily or accept (p)ermanently?

但是当我从批处理文件执行脚本时,我没有收到此消息,默认情况下,调用check_output失败。
有没有办法在调用subprocess.check_output时传递输入,以便我可以批量运行脚本。

嗨,我正在更新我的问题: 我尝试使用以下命令从命令提示符运行svn,

echo t | svn.exe list Https://127.0.0.1:443/svn/Repos

我没有任何用户输入就得到了输出。

但我无法通过echo t |中的subprocess.check_output。 有没有办法做到这一点?

请帮我解决这个问题。 感谢

3 个答案:

答案 0 :(得分:1)

我想这不是标题中问题的答案,但您是否尝试使用svn运行--non-interactive --trust-server-cert?这不是你想要的吗?

答案 1 :(得分:1)

您收到的消息看起来与证书有关。因此,不是添加传递输入到命令的复杂性,而是修复证书问题或将the --trust-server-cert flag传递给SVN命令。

res = subprocess.check_output(["svn.exe", "--trust-server-cert", "list", "url"], stderr=subprocess.STDOUT)

答案 2 :(得分:0)

我为我的问题找到了两个解决方案,

1.从这个链接http://desipenguin.com/techblog/2009/01/13/fun-with-python-subprocessstdin/

发现这个灵魂
proc = subprocess.Popen((["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
print proc.communicate(‘t\n’)[0]

这解决了为流程提供关键输入't'。但我无法读取输出。所以,我遵循了第二个解决方案。

2.使用两个子流程:

p = subprocess.Popen("echo t |", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p1 = subprocess.Popen(["svn.exe", "list", "Https://127.0.0.1:443/svn/Repos"], shell=True, **stdin=p.stdout**, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
output = p1[0]

此处,过程1的输出作为过程2的输入给出。因此,这等于echo t | svnmucc mkdir d:\temp

感谢。