Python 如何在Django环境中执行外部脚本

Python 如何在Django环境中执行外部脚本,python,django,pycharm,Python,Django,Pycharm,我试图在Django控制台使用的环境中执行一个外部代码段,用于调试和类似终端的目的,以便它可以连接到db,等等 基本上,我使用它的原因与人们摆弄控制台的原因相同,但我使用更长的代码片段来输出一些格式化信息,因此在实际文件中使用IDE处理这些代码非常方便 一个回答说您可以通过执行python manage.py shell提示 那我该怎么做呢 顺便说一句,我正在使用PyCharm,以防这个IDE有一种简写的方法来完成这项工作或任何特殊的工具。很多时候,你需要脚本来使用db或更多。但是您需要使用dj

我试图在Django控制台使用的环境中执行一个外部代码段,用于调试和类似终端的目的,以便它可以连接到db,等等

基本上,我使用它的原因与人们摆弄控制台的原因相同,但我使用更长的代码片段来输出一些格式化信息,因此在实际文件中使用IDE处理这些代码非常方便

一个回答说您可以通过执行
python manage.py shell
来实现这一点,但我没有看到成功的结果。虽然没有报告错误,但我没有得到例外的输出,只有一系列的
>
提示

那我该怎么做呢


顺便说一句,我正在使用PyCharm,以防这个IDE有一种简写的方法来完成这项工作或任何特殊的工具。

很多时候,你需要脚本来使用db或更多。但是您需要使用django方式,即ORM,并处理项目中的每一件事情

你可以结账

您可以在项目主目录中创建脚本文件夹,并记录方法运行。该应用程序为您提供了一种轻松运行这些脚本的方法。 怎么做

步骤1-安装软件包。 第2步-在项目根目录中使用init.py创建脚本文件夹,并在应用程序中添加“django_扩展” 步骤3-在脚本文件夹中创建文件send_email_to_users.py。简单的例子

from project.models import MyModel
from django.contrib.auth.models import User
from project.utils import send_email

def run():
    results = MyModel.objects.all()
    for res in results:
         send_mail(res.email)
现在,您可以从命令行运行

python manage.py runscript send_mail_to_users

我想说,创造一个新的环境是实现这一目标的最佳途径

但您可以在django环境中运行脚本。我有时使用它来运行一次性脚本或一些简单的测试

您必须将环境变量
DJANGO\u SETTINGS\u MODULE
设置为设置模块,然后必须调用
DJANGO.setup()

我从
manage.py
脚本中复制了这些行,您必须设置正确的设置模块

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")
django.setup()
下面是我有时使用的一个简单模板脚本:

# -*- coding: utf-8 -*-
import os
import django

#  you have to set the correct path to you settings module
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.local")
django.setup()


from project.apps.bla.models import MyModel


def run():
    # do the work
    m = MyModel.objects.get(pk=1)


if __name__ == '__main__':
    run()

需要注意的是,如果只是一次性脚本,则所有项目导入都必须放在调用
django.setup()

之后

import django
django.setup()

from myapp.models.import MyModel 
您需要设置环境变量,以便从IDE运行它最简单(使它成为同一项目的一部分,右键单击该文件,应该有一个运行选项)


如果您希望在生产环境中运行某些东西,我会按照DanEEStar的建议创建一个管理命令

谢谢你。虽然由于导入失败,我似乎遇到了环境问题。如果我理解正确,我会将“management/commands”放在我可以使用该命令的任何应用程序目录下,对吗?您必须将其放在一个(已安装)应用程序的
management/commands
子包中(最好是与该命令相关的应用程序)。IOW
yourapp/management
yourapp/management/commands
必须包含一个
\uuuu init\uuuuuuuy.py
文件(通常为空)。我遇到了与尝试定义自定义命令时相同的导入错误:/无法导入的模块只是我自己应用程序中的模块,但我无法理解为什么他们在尝试这样做时会失败,因为在运行服务器或终端时不会发生任何问题。在这种情况下,会有什么不同,从而导致这种突然的导入错误?您能否给出一个从某个模型导入失败的示例。目前Windows中Python3上的Django不起作用。如果我这样运行它,它总是抱怨
DJANGO\u设置\u模块
没有设置;如果我在命令行上传入该环境变量,它会为我的项目提供ModuleNotFoundError。设置能否给出一个示例?我不知道该怎么做,也不知道django扩展与之有什么关系。