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ę.
python
django
django-shell
Ciro Santilli
źródło
źródło
django
działa, co tak naprawdę chcesz zrobić?my_script.py
zawiera kilka operacji na jednym z moich modeli Django. Zrobiłem to już wcześniej, ale nie pamiętam, jak dokładnie.Odpowiedzi:
<<
Część jest źle, użyj<
zamiast:Możesz także:
W przypadku python3 musisz użyć
źródło
./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 tworzeniamanage.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
w tym celu utwórz plik w podkatalogu
management
icommands
swoimapp
, tjiw tym pliku zdefiniuj niestandardowe polecenie (upewniając się, że nazwa pliku to nazwa polecenia, z którego chcesz wykonać
./manage.py
)źródło
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):
nadef 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:
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)
źródło
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:
reszta twoich rzeczy trafia tutaj ....
źródło
sys.path.append
rzeczy, dopóki maszDJANGO_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ń djangoPróbka
script.py
do przetestowania:Wspomniany na: http://django-extensions.readthedocs.io/en/latest/command_extensions.html i udokumentowany na:
Jest też samouczek .
Testowane na Django 1.9.6, rozszerzenia django 1.6.7.
źródło
django-extensions
(powinieneś). Uwaga: wygląda na to, żerunscript
używa standardowego djangoshell
. Byłoby fantastycznie, gdyby był używanyshell_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
:źródło
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
źródło
@AtulVarma podał bardzo przydatny komentarz pod niedziałającą zaakceptowaną odpowiedzią :
źródło
jeśli nie masz wielu poleceń w skrypcie, użyj go:
Dokumenty Django
źródło
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
a następnie pobiegł
python3 my_command.py
(Django 2.0.2)
źródło
sys.path.append('/path/to/myproject')
zBASE_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!źródło
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
i wykonaj
my_script.py
tylko z pythonem w katalogu, w którym masz,settings.py
ale jest to trochę hacky.źródło
Jeśli chcesz wpaść w BG jeszcze lepiej:
Wyjście będzie w
nohup.out
źródło
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
źródło
Wypróbuj to, jeśli korzystasz z wirtualnego środowiska: -
do korzystania z tych poleceń musisz znajdować się w środowisku wirtualnym. do tego zastosowania:
na przykład :-
Uwaga : - tutaj moja nazwa witryny to moja strona internetowa, a jango to nazwa mojego wirtualnego środowiska
źródło
przyszedł tutaj z tym samym pytaniem co OP, a moją ulubioną odpowiedź znalazłem właśnie w błędzie w pytaniu, które działa również w Pythonie 3:
źródło
Innym sposobem jest wykonanie tego:
Działa to na Python2.7 i Django1.9
źródło
Jeśli chcesz uruchomić skrypt startowy (np. Zaimportować niektóre modele django, aby pracować z nimi interaktywnie) i pozostać w powłoce django:
źródło
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):
Ze skryptem (Runcript.sh):
Skrypt nie jest ograniczony liczbą argumentów. Obsługiwane są jednak tylko argumenty typów pierwotnych (int, float, string)
źródło
runscript
zdjango-extensions
pakietu zrobić to samo, sprawdź to django-extensions.readthedocs.io/en/latest/runscript.htmlPóź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ępnydjango_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.i po prostu zaimportuj skrypt do powłoki w następujący sposób.
źródło
django.setup () nie działa.
nie wydaje się również wymagane.
to samo działało.
źródło