Django 1.6独立脚本在Django环境中运行失败

3 投票
3 回答
2306 浏览
提问于 2025-04-17 22:09

我有一个独立的脚本,需要在Django环境中运行。这个脚本使用了数据库的ORM(对象关系映射)等功能。当我尝试运行它时,出现了一个错误,提示 from .generators import thread_generator。所以,很明显这个脚本不在Django环境里。我在网上查了很多资料,尝试了各种方法,但还是没有成功。目前,我尝试了下面的方式,但依然没有效果。我甚至不确定 bot_server.local 是否正确,或者应该用 bot_server.settings。不过,我确实在设置中使用了 local.py。我不能把它当作命令来运行,因为我需要它作为一个独立的脚本来使用。我希望这个设置能在脚本内部永久生效,而不是依赖临时的环境变量。

from functools import wraps
import sys
import os
import datetime
import base64
import json
from django.db import connection
from django.core.management.base import BaseCommand, CommandError
from .generators import thread_generator
from .do_request import do_request
from .models import Employee, ThreadVault

if __name__ == '__main__':
    os.environ['DJANGO_SETTINGS_MODULE'] = "bot_server.local"
    sys.path.append("/home/git/bot_server/bot_server")

3 个回答

1

是的,这个答案说得很简单。

下面是一个manage.py文件的示例:

#!/usr/bin/env python

from settings.common import PROJECT_ROOT
import os
import sys


os.chdir(PROJECT_ROOT)
sys.path.insert(0, os.path.abspath(os.path.join(PROJECT_ROOT, "..")))

for i, arg in enumerate(sys.argv):
   if arg.startswith("--site"):
      os.environ["MEZZANINE_SITE_ID"] = arg.split("=")[1]
      sys.argv.pop(i)

if __name__ == "__main__":
    settings_module = "settings.common"
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings_module)
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)
2

这个答案其实很简单……只需要把manage.py里的内容粘贴过来就行:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bot_server.settings.local")

    from django.core.management import execute_from_command_line

我看了这么多帖子,真不敢相信之前居然没有人提到过这个。

3

要运行一个独立的脚本,你只需要在开始你的脚本之前写下这段代码。独立脚本执行时遇到的问题是它找不到Django的环境,所以为了让它找到这个环境,我们需要添加设置文件。

//Start your code here

import os, sys
from os import path

proj_path = "project_path\project_name"

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
sys.path.append(proj_path)
os.chdir(proj_path)

from django.core.wsgi import get_wsgi_application

from app1.models import *
from app2.models import model_name
from app3.models import model_name1, model_name2

application = get_wsgi_application()

//Start your script from here 

撰写回答