it-swarm.com.ru

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

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

./manage.py Shell << my_script.py

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

185
user2429940

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

$ ./manage.py Shell < myscript.py

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

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

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

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

Вам не рекомендуется делать это из 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
181
danodonovan

Для тех, кто использует 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)

83
cgons

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

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

остальная часть ваших вещей идет сюда ....

65
e-nouri

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-расширения 1.6.7.

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

%run my_script.py
9
gitaarik

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

Это работает в Джанго> = 1.4

7
ziima

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

echo 'import myscript' | python manage.py Shell
3
raratiru

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

3
Simone
import os, sys, Django
os.environ["Django_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

Django.setup()
2
user5121699

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

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

python manage.py Shell

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

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

1
Rahul Satal

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

manage.py Shell --command="import Django; print(Django.__version__)"

Django docs

1
MrNinjamannn

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

0
tseboho

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

./manage.py Shell <<EOF
import my_script
my_script.main()
EOF
0
mariotomo

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

Nohup echo 'exec(open("my_script.py").read())' | python manage.py Shell &

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

0
Kevin He