【问题标题】:How to execute external script in the Django environment如何在 Django 环境中执行外部脚本
【发布时间】:2017-06-09 01:34:57
【问题描述】:

我正在尝试在 Django 控制台使用的环境中执行外部 sn-p 以进行调试和类似终端的目的,以便它可以连接到数据库等。

基本上,我使用它的原因与使用控制台的原因相同,但我使用更长的 sn-ps 来输出一些格式化信息,因此将代码放在使用 IDE 操作的实际文件中很方便。

答案说您可以通过执行python manage.py shell < snippet.py 来做到这一点,但我没有看到成功的结果。而且虽然没有报错,但我没有得到异常的输出,而只有一系列>>> 提示。

那么我该怎么做呢?

顺便说一句,我正在使用 PyCharm,以防这个 IDE 有执行此操作的简写方式或任何特殊工具。

【问题讨论】:

  • 谢谢。尽管由于导入失败,我似乎遇到了环境问题。如果我理解正确,我应该将“管理/命令”放在我可以使用该命令的任何应用程序目录下,对吧?
  • 你必须把它放在你的一个(安装的)应用程序的management/commands子包中(最好是命令与相关的一个)。 IOW yourapp/management yourapp/management/commands 必须包含一个__init__.py 文件(通常为空)。

标签: python django pycharm


【解决方案1】:

我想说创建一个新的Custom management command 是实现这一目标的最佳方式。

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

您必须将环境变量DJANGO_SETTINGS_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()之后。

【讨论】:

  • 我在尝试定义自定义命令时遇到了同样的导入错误:/ 无法导入的模块只是我自己的应用程序中的模块,但我只是不知道为什么它们会尝试执行此操作时失败,当运行服务器或终端时没有发生任何问题时。在这种情况下甚至会有什么不同导致这个突然的导入错误?
  • 您能否展示一个从您的某个模型中导入失败的示例。
  • 目前这不适用于 Windows 中 Python3 上的 Django。如果我这样运行它,它总是抱怨 DJANGO_SETTINGS_MODULE 没有被设置;如果我在命令行中传入该环境变量,它会为我的 project.settings 提供 ModuleNotFoundError
【解决方案2】:

很多时候你需要脚本来玩 db 或更多。但是您需要使用 django 方式,即 ORM 并使用您项目中的所有内容。

您可以结帐https://github.com/django-extensions/django-extensions

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

第 1 步 - 安装软件包。 第 2 步 - 在项目根目录中使用 init.py 创建一个脚本文件夹,并在您的应用程序中添加“django_extensions” 第 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-extensions 与它有什么关系。
【解决方案3】:

如果它只是一个一次性脚本,

import django
django.setup()

from myapp.models.import MyModel 

您需要设置环境变量,以便从 IDE 中运行它(使其成为同一项目的一部分,右键单击文件,应该有一个运行选项)。

如果您正在寻找在生产环境中运行的东西,我会按照 DanEEStar 的建议创建一个管理命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2016-04-08
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2019-10-28
    相关资源
    最近更新 更多