子进程 Popen 未捕获 wget --spider 命令结果
Subprocess Popen not capturing wget --spider command result
我对将子进程命令的输出捕获为字符串的理解是设置 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()
returns 空字节文字,b''
.
对我来说特别奇怪的是执行暂停,因为在 bash 中发出命令只是打印命令结果并直接 returns 到提示符。
我的所有搜索都只找到关于如何捕获子进程结果的问答,而不是关于必须以不同方式捕获的某些命令或关于 wget 和子进程的任何特定内容。
补充说明,我已经能够使用带有子进程的 wget
命令来下载文件(没有 --spider
选项)没有问题。
非常感谢任何帮助,这个让我很困惑。
我以前从未被 wget 询问过任何问题,但是某些进程(例如 ssh)确实会直接捕获终端设备 (tty) 以获取密码,从而缩短您设置的进程管道。
要使此类情况自动化,您需要伪造终端而不是普通管道。那里有使用 termios 和其他东西的食谱,但我的建议是使用模块 "pexpect",它正是为此而编写的。
stderr
正在捕获输出,因为您没有通过管道传输 stderr,所以当您 运行 命令和标准输出为空时,您会看到输出:
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'
我对将子进程命令的输出捕获为字符串的理解是设置 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()
returns 空字节文字,b''
.
对我来说特别奇怪的是执行暂停,因为在 bash 中发出命令只是打印命令结果并直接 returns 到提示符。
我的所有搜索都只找到关于如何捕获子进程结果的问答,而不是关于必须以不同方式捕获的某些命令或关于 wget 和子进程的任何特定内容。
补充说明,我已经能够使用带有子进程的 wget
命令来下载文件(没有 --spider
选项)没有问题。
非常感谢任何帮助,这个让我很困惑。
我以前从未被 wget 询问过任何问题,但是某些进程(例如 ssh)确实会直接捕获终端设备 (tty) 以获取密码,从而缩短您设置的进程管道。
要使此类情况自动化,您需要伪造终端而不是普通管道。那里有使用 termios 和其他东西的食谱,但我的建议是使用模块 "pexpect",它正是为此而编写的。
stderr
正在捕获输出,因为您没有通过管道传输 stderr,所以当您 运行 命令和标准输出为空时,您会看到输出:
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'