从子进程中执行curl的正确方法是什么?
我在尝试通过 subprocess
来调用 curl
下载图片,但总是遇到 curl 错误(错误代码 2,这个在文档中提到是 CURL_FAILED_INIT
)。我没有使用 urllib
,因为我最终会用 subprocess
执行一个脚本。以下是代码片段:
import subprocess
import multiprocessing
def worker(fname, k):
f = open(fname, 'r')
i = 0
for imgurl in f:
try:
op = subprocess.call(['curl', '-O', imgurl], shell=False)
except:
print 'problem downloading image - ', imgurl
def main():
flist = []
flist.append(sys.argv[1])
flist.append(sys.argv[2])
...
for k in range(1):
p = multiprocessing.Process(target=worker, args=(flist[k],k))
p.start()
输出:
curl: 可以尝试 'curl --help' 或 'curl --manual' 获取更多信息
2
curl: 可以尝试 'curl --help' 或 'curl --manual' 获取更多信息
2
....
1 个回答
7
如果你想运行一个命令行指令,使用subprocess是最合适的选择。因为它可以在自己的进程中启动一个命令行指令,所以使用多进程其实是多余的。多进程主要是在你想要在不同的进程中运行你Python程序的某个函数时才有用。看起来你是想运行一个命令行指令,而不是Python函数。
我对curl
不太熟悉。如果你想从curl
获取标准输出,可以使用subprocess.Popen()
。而subprocess.call()
返回的是程序的返回代码,而不是stdout
。
你可以查看这个链接了解更多信息:http://docs.python.org/release/3.2/library/subprocess.html
像这样:
subp = subprocess.Popen(['curl', '-O', imgurl], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
curlstdout, curlstderr = subp.communicate()
op = str(curlstdout)
可能更接近你的需求。正如我说的,我对curl
不太了解,所以你的程序可能会有所不同。