【问题标题】:How to execute code in the Django shell by an external python script?如何通过外部 python 脚本在 Django shell 中执行代码?
【发布时间】:2016-04-08 02:23:46
【问题描述】:

我想要达到的目标:

我想创建一个 python 脚本来从 CLI 停用数据库中的 Django 用户。我想出了这个:

$ sudo python manage.py shell
>>> user = User.objects.get(username=FooBar)
>>> user.is_active = False
>>> user.save()
>>> exit()

当我在命令后手动输入命令时,上面的代码有效。但是,我想将执行命令放在一个 .py 脚本中,例如

$ sudo python script.py

现在我尝试了不同的方法:

  • os.system("command1 && command2 && command3")
  • subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)

问题:

这不起作用! 我认为这个问题就在这里,因为 Python 一直等到打开的 Django shell(第一个命令)完成,而这永远不会。它不会执行脚本中的其余命令,因为第一个命令将其置于 Hold。

subprocess.popen 可以在 shell 中执行命令,但只能在 Python shell 中执行,我想使用 Django shell。

有人知道如何使用 .py 脚本访问 Django shell 以执行自定义代码吗?

【问题讨论】:

  • python manage.py shell < script.py 怎么样?

标签: python linux django shell manage.py


【解决方案1】:

首先,您不应该使用sudo 访问您的Python shell。无需以 root 身份运行。

其次,创建从命令提示符运行的脚本的方法是编写自定义的 manage.py 脚本,这样您就可以运行./manage.py deactivate_users。完整的操作说明在the documentation

【讨论】:

    【解决方案2】:

    尝试将命令输入到正在运行的 django-shell 作为此处的文档:

    $ sudo python manage.py shell << EOF
    user = User.objects.get(username=FooBar)
    user.is_active = False
    user.save()
    exit()
    EOF
    

    【讨论】:

    • 这对我有用!一个问题是不是可以运行一个 .py 文件而不是在EOF 中编写代码?运行 python manage.py shell
    【解决方案3】:

    如果要执行访问 Django 模型的 Python 脚本,首先需要设置一个环境变量:

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<path>.settings")
    

    您需要将其中的&lt;path&gt; 替换为您的项目目录,即包含文件settings.py 的目录。

    然后您可以导入模型文件,例如:

    from <path>.models import User
    user = User.objects.get(username=FooBar)
    user.is_active = False
    user.save()
    

    【讨论】:

      【解决方案4】:

      根据 Daniel 在此线程前面的评论,我创建了一个简单的脚本来完成工作。我正在为试图实现相同目标的该线程的读者分享这个。该脚本将创建一个有效的“ma​​nage.py deactivate_user”函数。

      这是您的 Django 应用文件夹结构的示例参考:

      您要创建“deactivate_user.py”文件并将其放在 management/commands/deactivate_user.py 目录中。

      from django.core.management.base import BaseCommand, CommandError
      from django.contrib.auth.models import User
      
      class Command(BaseCommand):
          help = 'Deactivate user in the database'
      
          def handle(self, *args, **options):
              username = raw_input('Please type the username of the user you want remove: ')
              try:
                  user = User.objects.get(username=username)
                  user.is_active = False
                  user.save()
                  print ('User is now deactivated in the database.')
              except User.DoesNotExist:
                  print ('Username not found')
      

      使用“python manage.py deactivate_user”调用脚本您也可以使用相同的代码创建一个“activate_user”脚本,但不要使用 user.is_active = False 使用 = True。

      【讨论】:

        【解决方案5】:

        打开 Django Shell python manage.py shell

        然后运行execfile('filename.py')

        【讨论】:

          【解决方案6】:

          如果您使用的是 Django 1.8+,那么另一个有用的选项是编写自己的脚本,并使用 manage.py runscript 调用它。

          例如,您可以编写一个名为 db_init.py 的脚本并将其放在 utils 文件夹下。
          然后使用以下命令启动此脚本:

          python3 manage.py runscript utils.db_init
          

          参考:
          https://django-extensions.readthedocs.io/en/latest/runscript.html

          【讨论】:

            猜你喜欢
            • 2013-04-17
            • 1970-01-01
            • 2019-12-29
            • 1970-01-01
            • 1970-01-01
            • 2018-02-19
            • 2017-06-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多