如何将django call_command的输出保存到变量或文件中

时间:2014-10-24 21:55:18

标签: python django

我在类似于:

的脚本中调用Django中的命令
#!/usr/bin/python
from django.core.management import call_command
call_command('syncdb')
call_command('runserver')
call_command('inspectdb')

如何将例如call_command(' inspectdb')的输出分配给变量或文件?

我已经尝试了

var = call_command('inspectdb')

但是' var'保持为none:目的:检查不是由django创建的旧数据库中的现有表

2 个答案:

答案 0 :(得分:12)

您必须重定向call_command的输出,否则它只会打印到stdout但不返回任何内容。您可以尝试将其保存到文件中,然后按以下方式读取:

with open('/tmp/inspectdb', 'w+') as f:
    call_command('inspectdb', stdout=f)
    var = f.readlines()

编辑: 几年后看一下这个,更好的解决方案是创建一个StringIO来重定向输出,而不是真正的文件。 以下是Django's test suites之一的示例:

def test_command(self):
    out = StringIO()
    management.call_command('dance', stdout=out)
    self.assertIn("I don't feel like dancing Rock'n'Roll.\n", out.getvalue())

答案 1 :(得分:0)

这在Django Documentation中的“从代码运行管理命令>输出重定向”中进行了记录。

要保存到变量,可以执行以下操作:

import io
from django.core.management import call_command


with io.StringIO() as out:
   call_command('dumpdata', stdout=out)
   print(out.getvalue())

要保存到文件,可以执行以下操作:

from django.core.management import call_command


with open('/path/to/command_output', 'w') as f:
    call_command('dumpdata', stdout=f)