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

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

./manage.py shell << my_script.py

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

Ответ 1

Часть << неверна, вместо этого используйте <:

$ ./manage.py shell < myscript.py

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

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

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

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

Ответ 2

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

Если это сценарий, который вы будете запускать несколько раз, рекомендуется установить его как пользовательскую команду, т.е.

 $ ./manage.py my_command

для этого создайте файл в подкаталоге 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(self, **options):
        # now do the things that you want with your models here

Ответ 3

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

После некоторого копания я нашел ответ "Переполнение стека": fooobar.com/questions/44106/...

Теперь вам нужно:

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

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

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

Ответ 4

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

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

остальная часть вашего материала идет здесь....

Ответ 5

runscript из django-extensions

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.

Ответ 6

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

%run my_script.py

Ответ 7

Вы можете просто запустить script с помощью переменной окружения DJANGO_SETTINGS_MODULE. Это все, что требуется для настройки среды Django-оболочки.

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

Ответ 8

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

echo 'import myscript' | python manage.py shell

Ответ 9

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

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

Я должен был начать 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

(Джанго 2.0.2)

Ответ 10

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

django.setup()

Ответ 11

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

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

Django Docs

Ответ 12

Обратите внимание: этот метод устарел для более поздних версий 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

Ответ 13

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

оболочка python manage.py

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

workon vir_env_name

например: -

[email protected]:~/mysite$ workon jango
(jango)[email protected]:~/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 - мое виртуальное имя среды

Ответ 14

Если вы хотите, чтобы работать в BG еще лучше:

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

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

Ответ 15

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

Ответ 16

пришел сюда с тем же вопросом, что и OP, и я нашел свой любимый ответ именно в ошибке в вопросе, которая работает также в Python 3:

./manage.py shell <<EOF
import my_script
my_script.main()
EOF

Ответ 17

Другой способ выполнить это:

echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base

Это работает на Python2.7 и Django1.9

Ответ 18

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

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

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

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