Что такое правильный метод для выполнения curl из подпроцесса?

Я пытался вызвать curl С subprocess для загрузки изображений, но продолжал получать ошибку curl (код ошибки 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 ответов


если вы хотите запустить команду оболочки, подпроцесс путь. Поскольку это может запустить команду оболочки в собственном процессе, использование многопроцессорной обработки в лучшем случае избыточно. Многопроцессорная обработка удобна, когда вы хотите запустить функцию вашей программы 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 Как я уже сказал, поэтому ваша программа может отличаться.