Muszę wykonać skrypt Pythona z powłoki Django. Próbowałem:
./manage.py shell << my_script.py
Ale to nie zadziałało. Czekałem, aż coś napiszę.
Muszę wykonać skrypt Pythona z powłoki Django. Próbowałem:
./manage.py shell << my_script.py
Ale to nie zadziałało. Czekałem, aż coś napiszę.
Odpowiedzi:
<<
Część jest źle, użyj <
zamiast:
$ ./manage.py shell < myscript.py
Możesz także:
$ ./manage.py shell
...
>>> execfile('myscript.py')
W przypadku python3 musisz użyć
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. Odkryłem, że może to być przydatne w przypadku szybkich i brudnych skryptów, które trzeba uruchomić tylko raz, bez konieczności przechodzenia przez uciążliwy proces tworzenia manage.py
polecenia.
Get-Content myscript.py | .\manage.py shell
Nie zaleca się tego robić z shell
- a jest to zamierzone, ponieważ tak naprawdę nie powinieneś wykonywać losowych skryptów ze środowiska django (ale są na to sposoby, zobacz inne odpowiedzi).
Jeśli jest to skrypt, który będziesz uruchamiał wiele razy, dobrym pomysłem jest skonfigurowanie go jako polecenia niestandardowego, tj
$ ./manage.py my_command
w tym celu utwórz plik w podkatalogu management
i commands
swoim app
, tj
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
iw tym pliku zdefiniuj niestandardowe polecenie (upewniając się, że nazwa pliku to nazwa polecenia, z którego chcesz wykonać ./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
jest przestarzałe. Ta strona zawiera działający przykład: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
na def handle(self, **options):
.
def handle(self, **options):
na komentarz Jamesa.
Dla każdego, kto używa Django 1.7+, wydaje się, że po prostu import modułu ustawień nie wystarczy.
Po pewnym kopaniu znalazłem odpowiedź Przepełnienie stosu: https://stackoverflow.com/a/23241093
Teraz musisz:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Bez powyższego dostałem django.core.exceptions.AppRegistryNoReady
błąd.
Mój plik skryptu znajduje się w tym samym katalogu, co mój projekt django (tj. W tym samym folderze co manage.py)
DJANGO_SETTINGS_MODULE
zmienna środowiskowa. Wystarczyło to: import django ; django.setup()
poniżej 1,7.
django.setup()
nie pozwoli skryptowi uzyskać dostępu do modeli Django, nawet ich nie zaimportować!
import django; django.setup()
.
Spóźniam się na przyjęcie, ale mam nadzieję, że moja odpowiedź komuś pomoże: Możesz to zrobić w skrypcie Python:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
reszta twoich rzeczy trafia tutaj ....
sys.path.append
rzeczy, dopóki masz DJANGO_SETTINGS_MODULES
rację (np. Jeśli skrypt znajduje się tuż nad katalogiem głównym witryny, możesz to zrobić os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
, że działa, kiedy jestem w katalogu projektu, mój DJANGO_SETTINGS_MODULE jest poprawny i próbuję uruchomić skrypt, który importuje modele, widoki itp.
runscript
z rozszerzeń django
python manage.py runscript scripty.py
Próbka script.py
do przetestowania:
from django.contrib.auth.models import User
print(User.objects.values())
Wspomniany na: http://django-extensions.readthedocs.io/en/latest/command_extensions.html i udokumentowany na:
python manage.py runscript --help
Testowane na Django 1.9.6, rozszerzenia django 1.6.7.
django-extensions
(powinieneś). Uwaga: wygląda na to, że runscript
używa standardowego django shell
. Byłoby fantastycznie, gdyby był używany shell_plus
(także w rozszerzeniach), więc nie trzeba było importować wszystkiego dla prostych skryptów.
Jeśli IPython jest dostępny ( pip install ipython
) ./manage.py shell
, automatycznie użyje jego powłoki, a następnie możesz użyć magicznego polecenia %run
:
%run my_script.py
runscript
, że działa ze skryptami spoza projektu / pakietu i nie narzeka w ten sposóbTypeError: the 'package' argument is required to perform a relative import for
Możesz po prostu uruchomić skrypt z DJANGO_SETTINGS_MODULE
ustawioną zmienną środowiskową. To wszystko, czego potrzeba, aby skonfigurować środowisko powłoki Django.
Działa to w Django> = 1.4
@AtulVarma podał bardzo przydatny komentarz pod niedziałającą zaakceptowaną odpowiedzią :
echo 'import myscript' | python manage.py shell
jeśli nie masz wielu poleceń w skrypcie, użyj go:
manage.py shell --command="import django; print(django.__version__)"
Jak inne odpowiedzi wskazują, ale nie jednoznacznie stwierdzają, może to nie być konieczne do wykonania skryptu z powłoki Django, ale do uzyskania dostępu do aplikacji bez użycia powłoki Django .
Różni się bardzo wersja Django od wersji Django. Jeśli nie znajdziesz rozwiązania dla tego wątku, odpowiedz tutaj - skrypt Django, aby uzyskać dostęp do obiektów modelu bez użycia powłoki manage.py - lub podobne wyszukiwania mogą ci pomóc.
Musiałem zacząć od 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
a następnie pobiegł python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject')
z BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
i `sys.path.append (BASE_DIR)`. Nie zapomnij również aktywować wirtualnej env przed wykonaniem polecenia!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Uwaga, ta metoda została uznana za przestarzałą w przypadku nowszych wersji django! (> 1.3)
Alternatywną odpowiedź można dodać na początku my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
i wykonaj my_script.py
tylko z pythonem w katalogu, w którym masz, settings.py
ale jest to trochę hacky.
$ python my_script.py
Coś, co właśnie uznałem za interesujące, to Django Scripts, które pozwalają pisać skrypty uruchamiane za pomocą foobara skryptów uruchomieniowych python manage.py. Bardziej szczegółowe informacje na temat implementacji i struktury można znaleźć tutaj, http://django-extensions.readthedocs.org/en/latest/index.html
Wypróbuj to, jeśli korzystasz z wirtualnego środowiska: -
powłoka python manage.py
do korzystania z tych poleceń musisz znajdować się w środowisku wirtualnym. do tego zastosowania:
workon nazwa_env_wir
na przykład :-
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)
>>>
Uwaga : - tutaj moja nazwa witryny to moja strona internetowa, a jango to nazwa mojego wirtualnego środowiska
Innym sposobem jest wykonanie tego:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Działa to na Python2.7 i Django1.9
Powłoka django jest dobrym sposobem na uruchomienie modułu python ze środowiskiem django, ale importowanie modułów i wykonywanie funkcji ręcznie nie zawsze jest łatwe i męczące, zwłaszcza bez automatycznego uzupełniania. Aby rozwiązać ten problem, stworzyłem mały skrypt powłoki „Runcript.sh” który pozwala w pełni skorzystać z automatycznego uzupełniania i historii logowania konsoli Linux.
NB: Skopiuj plik Runcript.sh do projektu głównego i ustaw prawidłowe wykonanie (chmod + x)
Na przykład: chcę uruchomić funkcję Pythona o nazwie show (a, b, c) w module do_somethings.py w myapp / do_folder /
Standardowy sposób django (powłoka manage.py):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
Ze skryptem (Runcript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
Skrypt nie jest ograniczony liczbą argumentów. Obsługiwane są jednak tylko argumenty typów pierwotnych (int, float, string)
runscript
z django-extensions
pakietu zrobić to samo, sprawdź to django-extensions.readthedocs.io/en/latest/runscript.html
Późno na imprezę. Ale może to być pomocne dla kogoś.
Wszystko czego potrzebujesz to skrypt i django-extensions
zainstalowany.
Wystarczy uruchomić shell_plus
dostępny django_extensions
i zaimportować napisany skrypt.
Jeśli twój skrypt znajduje scpt.py
się w folderze, fol
możesz go uruchomić w następujący sposób.
python manage.py shell_plus
i po prostu zaimportuj skrypt do powłoki w następujący sposób.
>>> from fol import scpt
django.setup () nie działa.
nie wydaje się również wymagane.
to samo działało.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
działa, co tak naprawdę chcesz zrobić?