[英]Python: How to save the output of os.system
在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)
os.system
函数通过shell运行命令,因此您也可以在其中放置任何stdio重定向。 您还应该使用-q
标志(安静)来进行wget。
cmd = "wget -q " + theurl + " >/dev/null 2>&1"
但是,有更好的方法在python中执行此操作,例如libcurl的pycurl包装器或“stock” urllib2
模块。
要回答您的直接问题,并且正如其他人所提到的那样,您应该强烈考虑使用子进程模块。 这是一个例子:
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
是您选择的目标路径。 有时可以自动确定此值,但方法取决于您的情况。
正如其他人所说,您可以使用Python本机库模块来执行I / O操作,也可以修改命令行以重定向输出。
但是要完全控制输出,最好的方法是使用Python subprocess
os.system()
模块而不是os.system()
。 使用subprocess
可以捕获输出并检查输出,或将任意数据输入标准输入。
当你想要一种快速而又肮脏的方式来运行某些东西时,请使用os.system()
。 如果要完全控制运行方式,请使用subprocess
。
wget进程只是写入STDOUT(如果发生了不好的事情,也可能是STDERR),这些仍然是“连线”到终端。
为了让它停止这样做,重定向(或关闭)所述文件句柄。 查看子进程模块,该模块允许在启动进程时配置所述文件句柄。 ( os.system
只os.system
生成进程的STDOUT / STDERR,因此它们是继承的,但子进程模块更灵活。)
有关很多很好的示例和解释,请参阅使用Python子流程 - 壳,流程,流,管道,重定向等等 (它介绍了STDIN / STDOUT / STDERR的概念,并从那里开始工作)。
有可能比使用wget更好的方法来解决这个问题 - 但我会留下其他答案。
快乐的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.