Як виконати скрипт Python із оболонки Django?


247

Мені потрібно виконати сценарій Python із оболонки Django. Я намагався:

./manage.py shell << my_script.py

Але це не спрацювало. Тільки чекали, коли я щось напишу.


Це не так, як djangoпрацює, що ти насправді хочеш зробити?
danodonovan

2
my_script.pyмістить кілька операцій на одній з моїх моделей Django. Я вже робив це раніше, але не можу пригадати, як саме.

Відповіді:


388

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

$ ./manage.py shell < myscript.py

Ви також можете зробити:

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

Для python3 вам потрібно буде скористатися

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

17
Для мене це виконує лише перший рядок сценарію. Єдине, що працює - це поєднання обох методів:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Стів Беннетт

Він більше не працює з Python 3+. Будь-яка ідея замінити це?
Девід Д.

4
@DavidD. Заміна наведена у цій відповіді тут
peter2108

11
Іншим рішенням , яке , здається, працює як для 2.x Python і 3.x є echo 'import myscript' | python manage.py shell. Я виявив, що це може бути корисним для швидких та брудних скриптів, які потрібно запустити лише один раз, без необхідності проходити громіздкий процес створення manage.pyкоманди.
Атул Варма

1
якщо ви робите це на оболонці живлення Windows: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha,

219

Ви не рекомендується робити це з shell- і це призначено , як ви не повинні дійсно бути виконання випадкових сценаріїв з середовища Джанго (але є способи обійти це, дивіться інші відповіді).

Якщо це сценарій, який ви будете запускати кілька разів, це гарна ідея встановити його як власну команду, тобто

 $ ./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

9
Знову це найкраща відповідь. Оскільки django 1.8 NoArgsCommandзастарілий. На цій сторінці наведено робочий приклад: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
Гер

2
Згідно з раніше коментар, щоб він працював для мене мені потрібно змінити , def handle_noargs(self, **options):щоб def handle(self, **options):.
Джеймс

Цікаве посилання тут на підтримку цієї відповіді та документації.
Маттіа Патерна

1
Щоб змусити його змінитись def handle(self, **options):як коментар Джеймса.
Омар Гонсалес

Елегантна відповідь. Велике спасибі
Tessaracter

103

Для всіх, хто використовує 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)


2
У моїй установці файл налаштувань вже посилається на DJANGO_SETTINGS_MODULEзмінну середовища. З цим достатньо було просто: import django ; django.setup()під 1.7.
Тейлор Едмістон

1
З django 1.7+ це має бути прийнята відповідь :)
acidjunk

Це однозначно правильна відповідь для Джанго 1.9.x. Якщо не працює django.setup(), скрипт не дозволить отримати доступ до моделей Django, навіть не імпортувати їх!
glarrain

У virtualenv можна просто import django; django.setup().
Користувач3759685

1
Ти зробив мій день! Дякую за цю публікацію Мені стало зажуритися на селері, тому що я не зміг виконувати завдання на менеджмент.call_command: D: D: D

68

Я спізнююсь на вечірку, але сподіваюся, що моя відповідь комусь допоможе: Ви можете це зробити у своєму сценарії Python:

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

решта ваших речей йде сюди ...


3
Також зауважте, що ви можете скидати sys.path.appendречі до тих пір, поки не будете DJANGO_SETTINGS_MODULESправильні (наприклад, якщо у вас є сценарій, що знаходиться над коренем вашого сайту, ви можете це зробити os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
mgalgs

Я закінчив це робити sys.path.append(os.getcwd()), це працює, коли я перебуваю всередині свого каталогу проектів, мій DJANGO_SETTINGS_MODULE правильний, і я намагаюся запустити сценарій, який імпортує моделі, перегляди тощо.
Даніло Кабелло

так, але ви не можете запустити його з будь-якого місця!
e-nouri

Це не працює для мене з django 1.6 - у мене є додаток. Я встановив свій шлях, щоб включити каталог проектів django і налаштувати параметри проекту. Але коли я намагаюся імпортувати додаток із "з shoppinglist.models import ShoppingList", мені з’являється помилка, що він не може знайти моделі. Ця сама лінія імпорту працює з оболонки Manag.py. Будь-які ідеї?
Франкстер

33

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.


1
Це найкраща відповідь, якщо ви вже використовуєте django-extensions(слід). Примітка. Схоже, runscriptвикористовується стандартне джанго shell. Було б фантастично, якби він використовувався shell_plus(також у розширеннях), тому вам не доведеться імпортувати все для простих сценаріїв.
grokpot

12

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

%run my_script.py

Працював як шарм!
Roel

Це має перевагу перед тим, runscriptщо він працює зі сценаріями поза проектом / пакетом і не скаржиться такTypeError: the 'package' argument is required to perform a relative import for
smido

8

Ви можете просто запустити сценарій за допомогою DJANGO_SETTINGS_MODULE набором змінної середовища. Це все, що потрібно для створення середовища Django-shell.

Це працює у Django> = 1.4




4

Як вказують інші відповіді, але прямо не зазначають, те, що вам насправді може знадобитися, це не обов’язково виконувати свій скрипт із оболонки Django, а отримувати доступ до своїх додатків без використання оболонки Django .

Це значно відрізняється від версії Джанго до версії Джанго. Якщо ви не знайдете своє рішення в цій темі, тут відповіді - сценарій Django для доступу до модельних об'єктів без використання оболонки Manag.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)


Це все ще працює для Django 3.0. Я замінив sys.path.append('/path/to/myproject')на BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))і `sys.path.append (BASE_DIR)`. Також не забудьте активувати свою віртуальну програму env перед виконанням команди!
mrj

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

django.setup()

1
Чи можете ви відредагувати пояснення, чому цей код відповідає на питання таким чином, який відрізняється від деяких дуже подібних попередніх відповідей? Відповіді, що стосуються лише коду, відлякують , оскільки вони не вчать рішення.
Натан Туггі

2

Зауважте, що цей метод був застарілий для більш пізніх версій 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

1

Якщо ви хочете ще більше запустити в БГ:

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

Вихід буде в nohup.out


0

Щось мені здалося цікавим - це сценарії Джанго, які дозволяють писати сценарії для запуску за допомогою програми python Manag.py. Більш детальну інформацію про впровадження та скрупульозну інформацію можна знайти тут, http://django-extensions.readthedocs.org/en/latest/index.html


0

Спробуйте це, якщо ви використовуєте віртуальне оточення: -

оболонка python Manag.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 - це моє віртуальне оточення


0

прийшов сюди з тим же питанням, що і в ОП, і я знайшов свою улюблену відповідь саме в помилці в питанні, яке працює і в Python 3:

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

0

Інший спосіб його виконання:

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

Це працює на Python2.7 та Django1.9


0

Якщо ви хочете виконати сценарій запуску (наприклад, імпортувати деякі моделі django для роботи з ними інтерактивно) і залишатися в оболонці django:

PYTHONSTARTUP=my_script.py python manage.py shell

0

Оболонка django - це хороший спосіб виконати модуль python із середовищем django, але імпортувати модулі та виконувати функції вручну, особливо без автоматичного завершення, не завжди просто і втомливо. Щоб вирішити це, я створив невеликий скрипт оболонки "runcript.sh" який дозволяє максимально скористатися автоматичним завершенням та історією журналу консолі Linux.

Примітка: Скопіюйте runcript.sh до кореневого проекту та встановіть право виконання (chmod + x)

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

Стандартний спосіб джанго (shell.py shell):

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

Зі скриптом (runcript.sh):

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

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


Привіт, напевно, runscriptз django-extensionsпакета зроби те саме, перевіри його django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4

Дякую мороз-nzcr4. Так, справді це розширення працює, але я вважаю його обмеженим папкою srcipts і лише функцією run (). За допомогою мого srcipt ви можете виконувати функцію в будь-якому місці будь-якої папки.
Martin13

0

Пізно на вечірку. Але це може бути корисним для когось.

Все, що вам потрібно, це ваш сценарій та django-extensionsвстановлений.

Просто запустіть shell_plusдоступний django_extensionsі імпортуйте написаний вами сценарій.

Якщо ваш скрипт є, scpt.pyа він знаходиться всередині папки, folви можете запустити його наступним чином.

python manage.py shell_plus

і просто імпортуйте свій скрипт всередині оболонки, як описано нижче.

>>> from fol import scpt

-1

django.setup (), здається, не працює.

не здається, що це також потрібно.

це одне працювало.

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

1
django.setup (), безумовно, потрібен для завантаження середовища Django.
colm.anseo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.