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

6 投票
1 回答
8075 浏览
提问于 2025-04-17 06:51

我在尝试通过 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不太了解,所以你的程序可能会有所不同。

撰写回答