【问题标题】:Subprocess Popen not capturing wget --spider command result子进程 Popen 未捕获 wget --spider 命令结果
【发布时间】:2015-02-09 17:36:10
【问题描述】:

我对将子进程命令的输出捕获为字符串的理解是设置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 中发出命令只会打印命令结果并直接返回到提示符。

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

附加说明,我已经能够使用wget 命令和子进程来下载文件(没有--spider 选项)没有问题。

非常感谢任何帮助,这让我很难过。

【问题讨论】:

  • 试试for line in iter(command.stdout.readline,""):print(line)
  • @Padraic Cunningham - 感谢您的建议,但它返回了无限系列的空字节文字。
  • 好的,所以您使用的是 python3,它将是 b"" 而不是 "",您期望什么输出?
  • @ Padraic Cunningham - wget --spider 命令的输出包含几行验证 url 的正确分辨率和它指向的文件的大小。以您指定的方式发出命令仍会导致子进程打印到终端。 print 命令不打印任何内容,因为子进程将一个空列表作为结果传递给它。我通过将命令放在列表理解中来验证这一点。
  • 添加了一个答案,由于某种原因,stderr 正在捕获输出

标签: python subprocess wget


【解决方案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'

【讨论】:

  • 非常感谢。我觉得自己很笨。
  • @Jefe,别担心,这并不明显。
【解决方案2】:

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

要使此类情况自动化,您需要伪造一个终端而不是普通管道。那里有使用 termios 和其他东西的食谱,但我的建议是使用模块“pexpect”,它就是为了做到这一点而编写的。

【讨论】:

  • 似乎是主要嫌疑人。我得试一试。
猜你喜欢
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多