Выполнение сценария командной строки из Django & Python - PullRequest
2 голосов
/ 28 июля 2010

Я создаю команду управления Django, которая создает скриншоты веб-сайта с помощью сценария Пола Хаммонда webkit2png (http://www.paulhammond.org/webkit2png/) и сохраняет их в моей БД.

Для этой команды я использую 'Вызовите 'command from' subprocess '. Как мне выполнить эту команду в определенном каталоге (в данном случае temp / под проектом django)? Мой текущий код выглядит так, но не находит сценарий для выполнения, который хранится в моем virtualenvпапка site-packages:

import os

from django.core.management.base import NoArgsCommand
from django.conf import settings
from subprocess import call

# Models
from reviews.models import Shop

class Command(NoArgsCommand):
    def handle_noargs(self, **options):
        # Shops
        shops = Shop.objects.all()

        path = os.path.join(settings.SITE_ROOT, '../env/lib/python2.6/site-packages')

        for shop in shops:
            print shop
            command = "cd temp; python %s/webkit2png.py -F %s" % (path, shop.url)
            call([command])

            # Read the screenshot file and insert to model's ImageField

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Вам необходимо использовать параметр cwd для call.Также я бы рекомендовал нормализовать путь перед его использованием.

path = os.path.normpath(os.path.join(settings.SITE_ROOT, 
    '../env/lib/python2.6/site-packages'))

for shop in shops:
    print shop
    call(["python", path + "/webkit2png.py", "-F", shop.url], cwd="temp")

# Read the screenshot file and insert to model's ImageField

call принимает те же аргументы, что и Popen .Вы можете найти еще кое-что, что поможет вам.Кроме того, лучше всего разбивать свои токены командной строки на отдельные строки в списке, передаваемые в call, и оставить для параметра shell значение по умолчанию False.Таким образом, вам не нужно беспокоиться о экранировании оболочки, цитировании или любом другом нарушении ваших параметров.

0 голосов
/ 28 июля 2010

Это не дает прямого ответа на ваш вопрос, но: зачем вам нужен подпроцесс для вызова скрипта Python? Вы можете просто посмотреть код "__main__" в файле webkit2png.py, import и использовать его.

...