在Python中,如果我使用“wget”使用os.system(“wget”)下载文件,它会在屏幕上显示如下:
Resolving...
Connecting to ...
HTTP request sent, awaiting response...
100%[====================================================================================================================================================================>] 19,535,176 8.10M/s in 2.3s
屏幕上有等。
如何将此输出保存在某个文件中而不是在屏幕上显示?
目前我运行的命令如下:
theurl = "< file location >"
downloadCmd = "wget "+theurl
os.system(downloadCmd)
答案 0 :(得分:20)
os.system
函数通过shell运行命令,因此您也可以在其中放置任何stdio重定向。您还应该使用-q
标志(安静)来进行wget。
cmd = "wget -q " + theurl + " >/dev/null 2>&1"
但是,有更好的方法在python中执行此操作,例如libcurl的pycurl包装器或“stock”urllib2
模块。
答案 1 :(得分:4)
要回答您的直接问题,并且正如其他人所提到的那样,您应该强烈考虑使用subprocess模块。这是一个例子:
from subprocess import Popen, PIPE, STDOUT
wget = Popen(['/usr/bin/wget', theurl], stdout=PIPE, stderr=STDOUT)
stdout, nothing = wget.communicate()
with open('wget.log', 'w') as wgetlog:
wgetlog.write(stdout)
但是,无需呼叫系统下载文件,让python为您做繁重的工作。
使用urllib,
try:
# python 2.x
from urllib import urlretrieve
except ImportError:
# python 3.x
from urllib.request import urlretrieve
urlretrieve(theurl, local_filename)
或urllib2,
import urllib2
response = urllib2.urlopen(theurl)
with open(local_filename, 'w') as dl:
dl.write(response.read())
local_filename
是您选择的目标路径。 有时可以自动确定此值,但方法取决于您的情况。
答案 2 :(得分:1)
正如其他人所说,您可以使用Python本机库模块来执行I / O,也可以修改命令行来重定向输出。
但是要完全控制输出,最好的方法是使用Python subprocess
模块而不是os.system()
。使用subprocess
可以捕获输出并检查输出,或将任意数据输入标准输入。
如果您想要快速而肮脏的方式来运行某些内容,请使用os.system()
。如果要完全控制运行方式,请使用subprocess
。
答案 3 :(得分:0)
wget进程只是写入STDOUT(如果发生了不好的事情,也可能是STDERR),这些仍然是“连线”到终端。
要让它停止这样做,请重定向(或关闭)所述文件句柄。查看subprocess模块,该模块允许在启动进程时配置所述文件句柄。 (os.system
只保留生成进程的STDOUT / STDERR,因此它们是继承的,但子进程模块更灵活。)
请参阅Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects and More以获取许多不错的示例和解释(它介绍了STDIN / STDOUT / STDERR的概念,并从那里开始工作)。
使用wget可能有更好的方法来解决这个问题 - 但我会将其留给其他答案。
快乐的编码。