Python 子进程Popen未捕获wget--spider命令结果

Python 子进程Popen未捕获wget--spider命令结果,python,subprocess,wget,Python,Subprocess,Wget,我对将子流程命令的输出捕获为字符串的理解是设置stdout=sucprocess.PIPE并使用command.communicate()捕获结果、错误 例如,键入以下内容: command = subprocess.Popen(["nmcli", "con"], stdout=subprocess.PIPE) res, err = command.communicate() 不向终端生成输出,并将所有连接信息作为字节文本存储在变量res.Simple中 但在这里,我却分崩离析: url =

我对将子流程命令的输出捕获为字符串的理解是设置
stdout=sucprocess.PIPE
并使用
command.communicate()
捕获
结果、错误

例如,键入以下内容:

command = subprocess.Popen(["nmcli", "con"], stdout=subprocess.PIPE)
res, err = command.communicate()
不向终端生成输出,并将所有连接信息作为字节文本存储在变量res.Simple中

但在这里,我却分崩离析:

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中发出命令只是打印命令结果并直接返回提示符

我所有的搜索都是关于如何捕获子流程结果的问答,而不是关于必须以不同方式捕获某些命令的问答,也不是关于wget和子流程的问答

另外请注意,我已经能够使用带有子流程的
wget
命令下载文件(无
--spider
选项),而不会出现问题


非常感谢任何帮助,这一点让我感到困惑。

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


要使这种情况自动化,您需要伪造一个终端而不是普通管道。有一些配方使用了termios和其他东西,但我的建议是使用模块“pexpect”,该模块就是为了实现这一点而编写的。

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'

请在iter(command.stdout.readline,“”)中尝试
:print(line)
@Padraic Cunningham-谢谢您的建议,但它会返回无限系列的空字节文本。好的,您使用的是python3,它将是
b”“
,而不是
,您希望得到什么输出?@Padraic Cunningham-wget--spider命令的输出包含几行代码,用于验证url的正确分辨率及其指向的文件的大小。以指定的方式发出命令仍会导致子进程打印到终端。print命令不打印任何内容,因为子流程将结果传递给它一个空列表。我通过将命令放入列表中验证了这一点。添加了一个答案,出于某种原因,stderr正在捕获输出似乎是一个主要的嫌疑犯。我得试一试。非常感谢。我觉得自己很笨。@Jefe,别担心,我不知道会是这样。