繁体   English   中英

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

[英]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.systemos.system生成进程的STDOUT / STDERR,因此它们是继承的,但子进程模块更灵活。)

有关很多很好的示例和解释请参阅使用Python子流程 - 壳,流程,流,管道,重定向等等 (它介绍了STDIN / STDOUT / STDERR的概念,并从那里开始工作)。

有可能比使用wget更好的方法来解决这个问题 - 但我会留下其他答案。

快乐的编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM