2016-12-19 71 views
0

它是如何,当我写这在我的终端下载该文件,下载文件

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 

URL = “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() 

我缺少什么?

谢谢

+0

你为什么要打电话沟通?你应该使用subprocess.call()而不是创建一个Popen实例。 –

回答

0

的URL可能不是正确的引用,所以它是由shell解释(与所有&字符...)

更好的运行与子的显式参数作为list

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

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

+0

对不起,我错过了我的文章空间,但他们在我的原始脚本。 – Elcook

+0

然后看我的编辑。同样的答案... –

0

而不是创建一个Popen实例,您可以使用call方法。不要通过shell=True ...只需将命令与shlex分开,以便参数可以作为列表传递。

import shlex 
import subprocess 

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