Мені потрібно виконати сценарій Python із оболонки Django. Я намагався:
./manage.py shell << my_script.py
Але це не спрацювало. Тільки чекали, коли я щось напишу.
Мені потрібно виконати сценарій Python із оболонки Django. Я намагався:
./manage.py shell << my_script.py
Але це не спрацювало. Тільки чекали, коли я щось напишу.
Відповіді:
<<
Частина неправильна, використовуйте <
замість цього:
$ ./manage.py shell < myscript.py
Ви також можете зробити:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Для python3 вам потрібно буде скористатися
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. Я виявив, що це може бути корисним для швидких та брудних скриптів, які потрібно запустити лише один раз, без необхідності проходити громіздкий процес створення manage.py
команди.
Get-Content myscript.py | .\manage.py shell
Ви не рекомендується робити це з 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
NoArgsCommand
застарілий. На цій сторінці наведено робочий приклад: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
щоб def handle(self, **options):
.
def handle(self, **options):
як коментар Джеймса.
Для всіх, хто використовує 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)
DJANGO_SETTINGS_MODULE
змінну середовища. З цим достатньо було просто: import django ; django.setup()
під 1.7.
django.setup()
, скрипт не дозволить отримати доступ до моделей Django, навіть не імпортувати їх!
import django; django.setup()
.
Я спізнююсь на вечірку, але сподіваюся, що моя відповідь комусь допоможе: Ви можете це зробити у своєму сценарії Python:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
решта ваших речей йде сюди ...
sys.path.append
речі до тих пір, поки не будете DJANGO_SETTINGS_MODULES
правильні (наприклад, якщо у вас є сценарій, що знаходиться над коренем вашого сайту, ви можете це зробити os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
, це працює, коли я перебуваю всередині свого каталогу проектів, мій DJANGO_SETTINGS_MODULE правильний, і я намагаюся запустити сценарій, який імпортує моделі, перегляди тощо.
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.
django-extensions
(слід). Примітка. Схоже, runscript
використовується стандартне джанго shell
. Було б фантастично, якби він використовувався shell_plus
(також у розширеннях), тому вам не доведеться імпортувати все для простих сценаріїв.
Якщо IPython доступний ( pip install ipython
), то ./manage.py shell
він автоматично використовуватиме його оболонку, і тоді ви можете використовувати магічну команду %run
:
%run my_script.py
runscript
що він працює зі сценаріями поза проектом / пакетом і не скаржиться такTypeError: the 'package' argument is required to perform a relative import for
Ви можете просто запустити сценарій за допомогою DJANGO_SETTINGS_MODULE
набором змінної середовища. Це все, що потрібно для створення середовища Django-shell.
Це працює у Django> = 1.4
@AtulVarma надав дуже корисний коментар під неробочою прийнятою відповіддю :
echo 'import myscript' | python manage.py shell
якщо у вашому сценарії не багато команд, використовуйте його:
manage.py shell --command="import django; print(django.__version__)"
Як вказують інші відповіді, але прямо не зазначають, те, що вам насправді може знадобитися, це не обов’язково виконувати свій скрипт із оболонки 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)
sys.path.append('/path/to/myproject')
на BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
і `sys.path.append (BASE_DIR)`. Також не забудьте активувати свою віртуальну програму env перед виконанням команди!
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
просто з python в каталозі, де у вас є, settings.py
але це трохи хакі.
$ python my_script.py
Щось мені здалося цікавим - це сценарії Джанго, які дозволяють писати сценарії для запуску за допомогою програми python Manag.py. Більш детальну інформацію про впровадження та скрупульозну інформацію можна знайти тут, http://django-extensions.readthedocs.org/en/latest/index.html
Спробуйте це, якщо ви використовуєте віртуальне оточення: -
оболонка 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 - це моє віртуальне оточення
Інший спосіб його виконання:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Це працює на Python2.7 та Django1.9
Оболонка 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
Пізно на вечірку. Але це може бути корисним для когось.
Все, що вам потрібно, це ваш сценарій та 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")
django
працює, що ти насправді хочеш зробити?