Какой правильный метод для выполнения curl из подпроцесса? - PullRequest
6 голосов
/ 22 ноября 2011

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

O / P:

curl: попробуйте 'curl --help' или 'curl --manual' для получения дополнительной информации

2

curl: попробуйте 'curl --help' или 'curl --manual' для получения дополнительной информации

2

....

1 Ответ

7 голосов
/ 22 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...