【问题标题】:External script and unapplied migrations外部脚本和未应用的迁移
【发布时间】:2016-02-04 08:53:44
【问题描述】:

我正在编写支持我的 Django 项目开发的脚本。首先,我想为此使用 bash,但由于缺乏足够的知识和完全没有时间,我决定使用 argparse 编写一些东西并使用 subprocess 运行系统命令。

一切都很顺利,直到我不得不运行

./manage.py migrate

我通过跑步来做到这一点:

import subprocess
...
subprocess.Popen("python {} migrate".format(absolute_path_to_manage_py).split())

输出看起来不错:

Operations to perform:
Apply all migrations: sessions, admin, auth, contenttypes, accounts, pcb
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
...
Applying sessions.0001_initial... OK    

它突然停止,但脚本仍然处于活动状态(它仍在运行),更糟糕的是,当我运行 django app 时,我收到一条消息,指出我仍有一些未应用的迁移。

我想我对从 Python 运行系统命令或与 django 迁移相关的东西一无所知。

任何提示我如何克服这个问题?

【问题讨论】:

  • POpen 是解锁功能。您应该通过管道或使用阻塞功能。你可以试试 subprocess.check_call docs.python.org/2/library/subprocess.html#module-subprocess
  • 尝试subprocess.check_call([sys.executable, 'manage.py', 'migrate'], cwd=os.path.dirname(absolute_path_to_manage_py)),从其目录运行manage.py并等待它完成(在非零退出状态时引发异常)

标签: python django subprocess django-migrations


【解决方案1】:

来自subprocess docs

启动子进程的推荐方法是使用以下 便利功能。对于没有这些的更高级的用例 满足你的需求,使用底层的Popen接口。

您可以使用subprocess.call(),它会等待命令完成:

returncode = subprocess.call(["python", absolute_path_to_manage_py, "migrate"])

【讨论】:

    【解决方案2】:

    不用子进程,可以直接使用call_command调用管理命令:

    from django.core.management import call_command
    
    call_command('migrate')
    

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2017-12-10
      • 2020-08-17
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多