выполнение grep из GNU делает

Нет причин использовать os.system. Избегайте написания сценария оболочки на Python и используйте что-то вроде urllib.urlretrieve или его эквивалента.

Редактировать ... чтобы ответить на вторую часть вашего вопроса, вы можете настроить пул потоков с помощью стандартной библиотеки Queue class. Поскольку вы много скачиваете, GIL не должен быть проблемой. Создайте список URL-адресов, которые вы хотите загрузить, и направьте их в свою рабочую очередь. Он будет обрабатывать запросы на отправку в рабочие потоки.

Я жду, когда обновление базы данных завершится, поэтому я собрал все это очень быстро.


#!/usr/bin/python

import sys
import threading
import urllib
from Queue import Queue
import logging

class Downloader(threading.Thread):
    def __init__(self, queue):
        super(Downloader, self).__init__()
        self.queue = queue

    def run(self):
        while True:
            download_url, save_as = queue.get()
            # sentinal
            if not download_url:
                return
            try:
                urllib.urlretrieve(download_url, filename=save_as)
            except Exception, e:
                logging.warn("error downloading %s: %s" % (download_url, e))

if __name__ == '__main__':
    queue = Queue()
    threads = []
    for i in xrange(5):
        threads.append(Downloader(queue))
        threads[-1].start()

    for line in sys.stdin:
        url = line.strip()
        filename = url.split('/')[-1]
        print "Download %s as %s" % (url, filename)
        queue.put((url, filename))

    # if we get here, stdin has gotten the ^D
    print "Finishing current downloads"
    for i in xrange(5):
        queue.put((None, None))

6
задан jackhab 29 October 2009 в 15:02
поделиться

2 ответа

Вам действительно нужно использовать $ (shell)?

GrepResult:= `grep 'ifeq (\$$(Param1)' TextFile`

all:
  echo ${GrepResult}

Протестировано с помощью GNU Make 3.81.

1
ответ дан 17 December 2019 в 00:11
поделиться

Уловка заключается в том, чтобы пропустить специальные символы за пределы Make и grep.

GrepResult := ${shell grep 'ifeq (\$$(Param1)' TextFile}

Make превращает $$ в $, а затем grep превращает \ $ в $. Также обратите внимание, что в этом присвоении используются фигурные скобки «{}», а не круглые скобки «()», чтобы не путать результаты поиска. (Может быть более надежный способ обработки строки, но не беда.)

Когда вы используете результат, используйте одинарные кавычки:

all:
    @echo '$(GrepResult)'

Это тоже было протестировано с GNUMake 3.81.

EDIT: Это также работает с $ (error ...):

    $(error '$(GrepResult)')
6
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: