子进程Popen没有捕获wget --spider命令结果

时间:2015-02-09 17:36:11

标签: python subprocess wget

我对将子进程命令的输出捕获为字符串的理解是设置stdout=sucprocess.PIPE并使用command.communicate()来捕获result, error

例如,输入以下内容:

command = subprocess.Popen(["nmcli", "con"], stdout=subprocess.PIPE)
res, err = command.communicate()

不向终端产生输出,并将所有连接信息作为字节文字存储在变量res中。简单。

虽然我在这里崩溃了:

url = "http://torrent.ubuntu.com/xubuntu/releases/trusty/release/desktop/xubuntu-14.04.1-desktop-amd64.iso.torrent"
command = subprocess.Popen(["wget", "--spider", url], stdout=subprocess.PIPE)

这将命令的输出打印到终端,然后暂停执行,直到用户输入击键。随后运行command.communicate()将返回空字节文字b''

对我来说特别奇怪的是暂停执行,因为在bash中发出命令只是打印命令结果并直接返回到提示符。

我的所有搜索都只是找到关于如何捕获子进程结果的Q& A,而不是关于某些命令必须以不同的方式捕获或关于wget和subprocess的任何特定事件。

另外请注意,我已经能够使用带有子进程的wget命令来下载文件(没有--spider选项)而没有问题。

任何帮助都非常感激,这个让我难过。

2 个答案:

答案 0 :(得分:1)

之前我从未被wget询问过任何问题,但是某些进程(例如ssh)会直接捕获终端设备(tty)以获取密码,从而缩短您设置的进程管道。

要自动执行此类情况,您需要伪造终端而不是普通管道。有使用termios和stuff的食谱,但我的建议是使用编写的“pexpect”模块。

答案 1 :(得分:1)

stderr正在捕获输出,因为您没有管道stderr,当您运行命令并且stdout为空时,您看到输出:

url = "http://torrent.ubuntu.com/xubuntu/releases/trusty/release/desktop/xubuntu-14.04.1-desktop-amd64.iso.torrent"
command = Popen(["wget", "--spider", url],stdout=PIPE,stderr=PIPE)
out,err = command.communicate()

print("This is stdout: {}".format(out))
print("This is stderr: {}".format(err))
This is stdout: b''
This is stderr: b'Spider mode enabled. Check if remote file exists.\n--2015-02-09 18:00:28--  http://torrent.ubuntu.com/xubuntu/releases/trusty/release/desktop/xubuntu-14.04.1-desktop-amd64.iso.torrent\nResolving torrent.ubuntu.com (torrent.ubuntu.com)... 91.189.95.21\nConnecting to torrent.ubuntu.com (torrent.ubuntu.com)|91.189.95.21|:80... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 37429 (37K) [application/x-bittorrent]\nRemote file exists.\n\n'