2016-12-19 70 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))