从子进程执行curl的正确方法是什么?

时间:2011-11-22 17:53:24

标签: python curl subprocess

我试图从curl调用subprocess来下载图片,但不断出现卷曲错误(错误代码2 ..来自doc指的是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()

O / P:

  

curl:尝试'curl --help'或'curl --manual'获取更多信息

     

2

     

curl:尝试'curl --help'或'curl --manual'获取更多信息

     

2

...

1 个答案:

答案 0 :(得分:7)

如果要运行shell命令,则可以使用子进程。由于这可以在其自己的进程中启动shell命令,因此使用多处理最多是多余的。当你想在不同的进程中运行python程序的一个函数时,多处理就派上用场了。您似乎打算运行shell命令,而不是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,所以你的程序可能会有所不同。