【问题标题】:To pass `echo t | ` as arg in `subprocess.check_output`通过`echo t | ` 作为 `subprocess.check_output` 中的 arg
【发布时间】:2012-11-10 20:08:06
【问题描述】:

我是 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

我在没有任何用户输入的情况下得到了输出。

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

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

【问题讨论】:

    标签: python batch-file subprocess


    【解决方案1】:

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

    【讨论】:

    • 嗨@Michael 我尝试添加"--non-interactive", "--trust-server-cert",但我收到服务器证书验证失败的错误。因此,如果您能告诉我如何为(R)eject, accept (t)emporarily or accept (p)ermanently? 传递输入,这将很有帮助,这样我就可以让 svn 接受证书。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,该消息与证书有关。即使我添加"--trust-server-cert",我也会收到服务器证书验证失败的错误。因此,如果您能告诉我如何传递输入,这将很有帮助,这样我就可以让 svn 接受证书。
    【解决方案3】:

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

    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

    谢谢。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2014-12-20
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多