使用python的子进程通过curl下载文件

时间:2016-12-19 18:11:38

标签: python curl subprocess

当我在终端上写下这个文件时,如何下载

curl "http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p50.pl?file=gfs.t00z.pgrb2full.0p50.f000&lev_10_m_above_ground=on&var_UGRD=on&var_VGRD=on&leftlon=0&rightlon=360&toplat=90&bottomlat=-90&dir=%2Fgfs.2016121900" -o "tmp_folder/gfs.t00z.pgrb2full.0p50.f000"

但是使用python的子进程模块,下载只是挂起?

import subprocess

网址=“http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p50.pl?file=gfs.t00z.pgrb2full.0p50.f000&lev_10_m_above_ground=on&var_UGRD=on&var_VGRD=on&leftlon=0&rightlon=360&toplat=90&bottomlat=-90&dir=%2Fgfs.2016121900

pipe = subprocess.Popen("curl " + URL + " -o" + " my_file", shell = True)
pipe.communicate()

我错过了什么?

谢谢

2 个答案:

答案 0 :(得分:0)

URL可能没有正确引用,因此它由shell解释(包含所有&个字符......)

最好使用显式参数作为list运行子流程:

pipe = subprocess.Popen(["curl",URL,"-o","my_file"])

shell=True可能会被省略。由于您没有使用任何shell功能,因此可以省去麻烦。

答案 1 :(得分:0)

而不是创建Popen实例,您只需使用call方法即可。不要传递shell=True ...只需将命令与shlex分开,这样args就可以作为列表传递。

import shlex
import subprocess

cmd = 'curl "http://foo.com" -o "foo.txt"'
subprocess.call(shlex.split(cmd))