gpt4 book ai didi

python - 使用Shell脚本在python Shell中运行命令的意外行为

转载 作者:行者123 更新时间:2023-12-02 20:59:42 24 4
gpt4 key购买 nike

我正在尝试为Django中 super 用户的初始设置编写脚本。我有一个运行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容器内部,我没有任何问题,并创建了 super 用户。

最佳答案

您需要引用命令的最后一半,以便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 django-admin 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文档讨论了添加参数和写入输出的方法。

关于python - 使用Shell脚本在python Shell中运行命令的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61057644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com