Как выполнить скрипт Python из оболочки Django?

Мне нужно выполнить скрипт Python из оболочки Django. Я попробовал:

./manage.py shell << my_script.py

но это не сработало. Он просто ждал, когда я что-нибудь напишу.

16 ответов


на << - это не так, используйте < вместо:

$ ./manage.py shell < myscript.py

вы также можете сделать:

$ ./manage.py shell
...
>>> execfile('myscript.py')

для python3 вам нужно будет использовать

>>> exec(open('myscript.py').read())

вам не рекомендуется делать это из shell - и это предназначено, поскольку вы не должны выполнять случайные скрипты из среды django (но там are способы обойти это, см. другие ответы).

если это сценарий, который вы будете запускать несколько раз, это хорошая идея, чтобы установить его как пользовательские команды ie

 $ ./manage.py my_command

для этого создайте файл в subdir в management и commands вашего app, т. е.

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

и в этом файле определите свою пользовательскую команду (убедитесь, что имя файла-это имя команды, которую вы хотите выполнить из ./manage.py)

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle_noargs(self, **options):
        # now do the things that you want with your models here

для тех, кто использует Django 1.7+, кажется, что просто импортировать модуль настроек недостаточно.

после некоторого рытья я нашел этот ответ переполнения стека:https://stackoverflow.com/a/23241093

вам нужно:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

не делая вышеизложенного, я получал django.core.exceptions.AppRegistryNoReady ошибка.

мой файл сценария находится в том же каталоге, что и мой проект django (т. е. в той же папке, что и manage.py)


Я опаздываю на вечеринку, но надеюсь, что мой ответ поможет кому-то: Вы можете сделать это в своем скрипте Python:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings

остальные ваши вещи идут сюда ....


runscript С django-расширения

python manage.py runscript scripty.py

пример script.py чтобы проверить это:

from django.contrib.auth.models import User
print(User.objects.values())

упоминается в: http://django-extensions.readthedocs.io/en/latest/command_extensions.html и описана в:

python manage.py runscript --help

есть учебник тоже.

протестировано на Django 1.9.6, django-extensions 1.6.7.


вы можете просто запустить скрипт с среды. Это все, что нужно для настройки среды Django-shell.

это работает в Django >= 1.4


если оболочкой IPython доступен (pip install ipython), то ./manage.py shell будет автоматически использовать его оболочку, а затем вы можете использовать магическую команду %run:

%run my_script.py

@AtulVarma предоставил очень полезный комментарий под неработающим принято отвечать:

echo 'import myscript' | python manage.py shell

обратите внимание, что этот метод устарел для более поздних версий django! (>1.3)

альтернативный ответ, вы можете добавить это в начало my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

и выполнить my_script.py просто с python в каталоге, где у вас есть settings.py но это немного суховато.

$ python my_script.py

import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()

попробуйте это, если вы используете виртуальные среды :-

python manage.py Шелл!--2-->

для использования этой команды вы должны находиться в виртуальной среде. для этого используйте: -

workon vir_env_name

например:

dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Примечание: - здесь mysite-мое имя сайта, а jango-мое имя виртуальной среды


Как показывают другие ответы, но не явно заявляют, что вам может понадобиться не обязательно выполнять свой скрипт из оболочки Django, но для доступа к вашим приложениям без использования оболочки Django.

это сильно отличается от версии Django к версии Django. Если вы не найдете свое решение в этой теме, ответы здесь -- скрипт Django для доступа к объектам модели без использования manage.py Шелл!--8--> -- или аналогичные поиски могут помочь вы.

Я должен был начать my_command.py с

import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()

import project.app.models
#do things with my models, yay

а потом побежал python3 my_command.py

(Django 2.0.2)


если в вашем скрипте не так много команд, используйте его:

manage.py shell --command="import django; print(django.__version__)"

Django docs


то, что я только что нашел интересным, - это Скрипты Django, которые позволяют вам писать скрипты для запуска с python manage.py runscript foobar. Более подробную информацию о реализации и структуре можно найти здесь,http://django-extensions.readthedocs.org/en/latest/index.html


Если вы хотите запустить в BG еще лучше:

nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &

выход будет в nohup.out


Джанго.setup (), похоже, не работает.

также не требуется.

это само по себе сработало.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")