代码之家  ›  专栏  ›  技术社区  ›  jorilallo

从Django和Python执行命令行脚本

  •  2
  • jorilallo  · 技术社区  · 14 年前

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

    对于这个命令,我使用“subprocess”中的“call”命令。如何在特定目录中执行此命令(在本例中是temp/under-django project)?我当前的代码如下所示,但找不到要执行的脚本,该脚本存储在我的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 回复  |  直到 10 年前
        1
  •  2
  •   Mike DeSimone    13 年前

    你需要使用 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
    

    采用与相同的参数 Popen . 你可能会发现更多的东西也有帮助。另外,最好在传递给的列表中将命令行标记拆分为单独的字符串 离开房间 shell 参数的默认值 False . 这样,您就不必担心shell转义、引用或任何会弄乱参数的事情。

        2
  •  0
  •   Ghislain Leveque    14 年前

    __main__ import