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

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

./manage.py shell << my_script.py

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

27 ответов

Решение

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

$ ./manage.py shell < myscript.py

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

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

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

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

Вам не рекомендуется делать это из 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_noargs(self, **options):
        # now do the things that you want with your models here

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

После некоторого поиска я нашел ответ на переполнение стека: /questions/46655066/oshibka-vyipolneniya-reestr-prilozheniya-esche-ne-gotov/46655079#46655079

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

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из джанго-расширений

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.

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

%run my_script.py

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

echo 'import myscript' | python manage.py shell

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

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

Django Docs

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

step1: Импорт

      import mysite.asgi

Шаг 2: необходимо выполнить скрипт Python, просто набрав:

      python test.py

Где файл test.py выглядит так:

      import mysite.asgi

from polls.models import GMD_TABLE
print ( [obj.gt_GMD_name for obj in GMD_TABLE.objects.all()] )

ИТОГ: Результат будет:

      ['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']

Где ['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE'] - значения GMD_TABLE

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

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

Как указывают другие ответы, но не указывают явно, что вам на самом деле может потребоваться не обязательно выполнение скрипта из оболочки 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)

Вы можете просто запустить:

python manage.py shell < your_script.py

Это должно сделать работу!

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

django.setup()

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

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

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

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

$ python my_script.py

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

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

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

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

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

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

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 - имя моей виртуальной среды.

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

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

Добавьте эти строки в свой Pythonscript.py

      import os
import sys
import django
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.append(str(BASE_DIR))
    
os.environ.setdefault("DJANGO_SETTINGS_MODULE","django_server_app.settings")
django.setup()

# add your code here

затем перейдите в каталог проекта и запуститеpython script.py

Если вы хотите выполнить сценарий запуска (например, импортировать некоторые модели django для интерактивной работы с ними) и оставаться в оболочке django:

PYTHONSTARTUP=my_script.py python manage.py shell

На самом деле это очень просто, как только вы откроете оболочку django с помощью python manage.py shell
тогда просто напишите
import test
импортировать test.py

      # test.py
def x():
  print('hello');

Теперь вы можете выполнять команды в этом файле как

      test.x() //  will print hello

Оболочка django - хороший способ выполнить модуль python в среде django, но не всегда легко и утомительно импортировать модули и выполнять функции вручную, особенно без автозаполнения. Чтобы решить эту проблему, я создал небольшой сценарий оболочки "runscript.sh", который позволяет вам в полной мере использовать возможности автозаполнения и истории журнала консоли Linux.

NB: Скопируйте runscript.sh в корневой проект и установите право выполнения (chmod +x)

Например: я хочу запустить функцию Python с именем show(a, b, c) в модуле do_somethings.py в myapp/do_folder/

Стандартный способ django (оболочка manage.py):

python3 manage.py shell
 > from myapp.do_folder import do_somethings
 > do_somethings.show("p1", "p2"  , 3.14159)

С помощью скрипта (runscript.sh):

./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159

Скрипт не ограничен количеством аргументов. Однако поддерживаются только аргументы примитивных типов (int, float, string).

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

Сначала проверьте свой файл.

      py manage.py

Если ваш файл отображается

      [contracts]
category_load

Теперь вы можете запустить файл .py, набрав powershell(терминал)

      py manage.py category_load

поместите globals().update(locals()) после оператора импорта

В противном случае он выполняет это:

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

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

Поздно на вечеринку. Но это может быть кому-то полезно.

Все, что вам нужно, это ваш сценарий и django-extensions установлен.

Просто запустите shell_plus доступно в django_extensions и импортируйте сценарий, который вы написали.

Если ваш сценарий scpt.py и это внутри папки fol вы можете запустить сценарий следующим образом.

python manage.py shell_plus

и просто импортируйте свой скрипт в оболочку следующим образом.

>>> from fol import scpt

Кажется, django.setup() не работает.

Похоже, не требуется.

это одно сработало.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
Другие вопросы по тегам