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

我想实现的是:

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

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

上面的代码在我手动inputmanualy命令后执行。 不过,我想把这个命令放在一个.py脚本里

 $ sudo python script.py 

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

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

问题:

这不行! 我认为这个问题在这里,因为Python等待,直到打开的Djangoshell(第一个命令)完成,永远不会。 它不会执行脚本中的其余部分,因为第一个命令将其置于Hold状态。

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

任何人想法如何使用.py脚本访问Django shell以执行自定义代码?

首先,你不应该用sudo来访问你的Python shell。 没有必要以root身份运行。

其次,创建从命令提示符运行的脚本的方法是编写自定义的manage.py脚本,以便运行./manage.py deactivate_users 。 完整的说明在文档中 。

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

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

在这个文件中你需要用你的项目目录替换<path> ,这个目录包含文件settings.py

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

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

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

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

根据丹尼尔早些时候在这个线程中的评论,我创建了一个简单的脚本来完成工作。 我正在分享这个试图达到相同目标的线程的读者。 这个脚本将创建一个工作的“ manage.py deactivate_user ”函数。

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

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 use = True。

打开Django Shell python manage.py shell

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