当我在终端上写下这个文件时,如何下载
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
pipe = subprocess.Popen("curl " + URL + " -o" + " my_file", shell = True)
pipe.communicate()
我错过了什么?
谢谢
答案 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))