使用shell脚本在pythonshell中运行命令时出现意外行为

2024-06-14 23:05:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图为django中超级用户的初始设置编写一个脚本。我有一个运行django的docker容器

docker exec -it "mydockername" bash -c echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')" | python manage.py shell

此脚本正在抛出一个错误

      File "manage.py", line 16
    ) from exc
         ^
SyntaxError: invalid syntax

但如果我执行命令

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')" | python manage.py shell

在docker容器内部,我没有任何问题,超级用户已经创建


Tags: djangodocker用户frompyecho脚本get
2条回答

试试这个:

docker exec -it "mydockername" bash -c "echo \"from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')\" | python manage.py shell"

您需要引用命令的后半部分,以便bash -c获得单个参数。这使得整个命令有点复杂(因为它已经使用了单引号和双引号),但是看起来

docker exec -it "mydockername" \
  bash -c "echo \"from django.contrib.auth import ...\" | python manage.py shell"

如果没有这一点,您的本地shell将首先尝试分离命令,并看到

docker exec ... | python manage.py shell

而且,由于bash -c只接受一个参数,因此在容器内运行的命令是

bash -c echo  # with another argument that gets ignored

您可能可以直接在主机上运行此命令(无需docker exec)。您需要编写一个备用的settings.py文件,指向Docker托管的数据库(数据库主机名为localhost,其端口通过ports:发布),然后这些设置可以到达容器内的数据库

这里最好的方法可能是避免编写通过docker exec启动的带引号的shell命令运行的Python脚本。编写一个小型扩展脚本,如Django文档Writing custom ^{} commands页中所述:

from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
class CreateSuperuser(BaseCommand):
  def handle(self, *args, **options):
    User = get_user_model()
    User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')

将其放置在management/commands/superuser.py中,您可以运行python manage.py superuser(可能通过docker exec)。Django文档讨论了添加参数和写入输出的方法

相关问题 更多 >