Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过外部python脚本在Django shell中执行代码?_Python_Linux_Django_Shell_Manage.py - Fatal编程技术网

如何通过外部python脚本在Django shell中执行代码?

如何通过外部python脚本在Django shell中执行代码?,python,linux,django,shell,manage.py,Python,Linux,Django,Shell,Manage.py,我想要实现的目标: 我想创建一个python脚本,从CLI停用数据库中的Django用户。我想到了这个: $ sudo python manage.py shell >>> user = User.objects.get(username=FooBar) >>> user.is_active = False >>> user.save() >>> exit() 当我手动输入一个又一个手动命令时,上述代码起作用。但是,我希望

我想要实现的目标:

我想创建一个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(第一个命令)完成,而这永远不会发生。它不执行脚本中的其余命令,因为第一个命令将其置于保留状态

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


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

尝试将命令作为以下文档输入到正在运行的Django shell:

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

$sudo python manage.py shell首先,您不应该使用
sudo
访问python shell。不需要以root身份运行


其次,创建从命令提示符运行的脚本的方法是编写一个自定义manage.py脚本,这样您就可以运行
/manage.py deactivate\u users
。完整的操作说明见。

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

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

根据Daniel在本帖前面的评论,我创建了一个简单的脚本来完成这项工作。我将此分享给本帖的读者,他们正试图实现同样的目标。此脚本将创建一个有效的“manage.py deactivate\u 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\u user”调用脚本。您还可以使用相同的代码创建“activate\u user”脚本,而不是user.is\u active=False use=True。

打开Django Shell
python manage.py Shell


然后运行
execfile('filename.py')
如果您使用的是Django 1.8+,那么另一个有用的选项是编写自己的脚本,并使用manage.py runscript调用它

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

python3 manage.py runscript utils.db_init
参考资料:

python manage.py shell
怎么样?
python3 manage.py runscript utils.db_init