Я хочу запустить скрипты python, которые должны выполнять:
django-admin startproject foobar
python manage.py barfoo
barfoo
в настройке INSTALLED_APP
.Как я могу это достичь?
Прочтите немного подпроцесса и метод Popen. Это может быть то, что вы ищете.
Popen(["django-admin", "startproject", "%s" % your_name ], stdout=PIPE).communicate()
Popen(["python", "manage.py", "%s" % your_app_name ], stdout=PIPE).communicate()
3. Я знаю, что это не идеальный код, но я просто даю идею.
with open("settings.py", 'r') as file:
settings = file.readlines()
new_settings = []
for line in settings:
if "INSTALLED APPS" in line:
new_settings.append(line.replace("INSTALLED_APPS = (", "INSTALLED_APPS = (\n'%s'," % your_app_name))
else:
new_settings.append(line)
with open("settings.py", 'w') as file:
file.write("".join(new_settings))
Кажется, что есть питонический способ сделать # 1 и # 2
https://docs.djangoproject.com/en/dev/ref/django-admin/#running-management-commands-from-your-code
from django.core import management
management.call_command('flush', verbosity=0, interactive=False)
management.call_command('loaddata', 'test_data', verbosity=0)
Через 6 лет я наткнулся на этот вопрос, пытаясь выяснить, как написать несколько тестов для приложения, которые добавляют только тег настраиваемого шаблона, которые взаимодействуют с другими приложениями в проекте. Надеюсь, это может помочь кому-то.
На основе ответа @groovehunter: официальная документация теперь (Django 1.10) включает эту функцию вне dev.
Обратите внимание, что вам нужно изменить текущий каталог на созданный проект до вызова startapp
. См. Этот ответ для получения более подробной информации.
from django.core import management
import os
management.call_command('startproject', 'foobar')
os.chdir('foobar')
management.call_command('startapp', 'barfoo')
или вы можете использовать дополнительный аргумент для startproject
для создания проекта в текущем каталоге, если вы уверены, что проблем не будет:
from django.core import management
management.call_command('startproject', 'foobar', '.')
management.call_command('startapp', 'barfoo')