Python:如何保存os.system的输出

时间:2011-08-20 01:58:39

标签: python

在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)

4 个答案:

答案 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可能有更好的方法来解决这个问题 - 但我会将其留给其他答案。

快乐的编码。