从Django&执行命令行脚本蟒蛇

时间:2010-07-28 10:27:13

标签: django screenshot

我正在构建一个Django管理命令,该命令使用Paul Hammond的webkit2png脚本(http://www.paulhammond.org/webkit2png/)创建网站屏幕截图,并将它们存储到我的数据库中。

对于这个命令,我正在使用'subprocess'中的'call'命令。如何在特定目录中执行此命令(在本例中为temp / under 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 个答案:

答案 0 :(得分:2)

您需要使用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。这样,您就不必担心shell转义,引用或任何搞乱参数的事情。

答案 1 :(得分:0)

这不直接回答你的问题但是:为什么你需要使用子进程来调用python脚本?你可以查看webkit2png.py文件中的“__main__”代码import并使用它。