Bagaimana cara menjalankan skrip Python dari shell Django?


247

Saya perlu menjalankan skrip Python dari shell Django. Saya mencoba:

./manage.py shell << my_script.py

Tapi itu tidak berhasil. Itu hanya menunggu saya untuk menulis sesuatu.


Ini bukan cara djangokerjanya, apa yang sebenarnya ingin Anda lakukan?
danodonovan

2
my_script.pyberisi beberapa operasi pada salah satu model Django saya. Saya sudah melakukan ini sebelumnya tetapi saya tidak ingat persisnya.

Jawaban:


388

Bagian <<itu salah, gunakan <sebaliknya:

$ ./manage.py shell < myscript.py

Anda juga bisa:

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

Untuk python3, Anda harus menggunakan

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

17
Bagi saya, ini hanya mengeksekusi baris pertama skrip. Satu-satunya hal yang berhasil adalah menggabungkan kedua metode:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett

Ini tidak berfungsi lagi dengan Python 3+. Adakah ide untuk menggantikan ini?
David D.

4
@ DavidD. Pengganti diberikan dalam jawaban ini di sini
peter2108

11
Solusi lain yang tampaknya berfungsi untuk kedua Python 2.x dan 3.x adalah echo 'import myscript' | python manage.py shell. Saya menemukan ini berguna untuk skrip cepat dan kotor yang hanya perlu Anda jalankan sekali saja, tanpa harus melalui proses rumit membuat manage.pyperintah.
Atul Varma

1
jika Anda melakukan ini pada catu daya Windows: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

Anda tidak disarankan untuk melakukan itu dari shell- dan ini dimaksudkan karena Anda seharusnya tidak benar-benar mengeksekusi skrip acak dari lingkungan Django (tetapi ada cara - cara di sekitar ini, lihat jawaban lain).

Jika ini adalah sebuah script yang Anda akan menjalankan beberapa kali, itu ide yang baik untuk memasangnya sebagai perintah khusus yaitu

 $ ./manage.py my_command

untuk melakukan ini, buat file dalam subdirek managementdan commandsAnda app, yaitu

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

dan dalam file ini tentukan perintah kustom Anda (memastikan bahwa nama file adalah nama perintah yang ingin Anda jalankan ./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
Sekali lagi ini adalah jawaban terbaik. Karena Django 1.8 NoArgsCommandsudah ditinggalkan. Halaman ini memberikan contoh yang bermanfaat: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
Ger

2
Seperti per komentar sebelumnya, untuk itu untuk bekerja bagi saya saya perlu untuk mengubah def handle_noargs(self, **options):ke def handle(self, **options):.
James

Tautan menarik di sini untuk mendukung jawaban ini dan dokumentasi.
Mattia Paterna

1
Untuk membuatnya berfungsi, ubahlah menjadi def handle(self, **options):komentar James.
Omar Gonzales

Jawaban elegan. Terima kasih banyak
Tessaracter

103

Bagi siapa pun yang menggunakan Django 1.7+, tampaknya mengimpor modul pengaturan saja tidak cukup.

Setelah menggali, saya menemukan jawaban Stack Overflow ini: https://stackoverflow.com/a/23241093

Anda sekarang perlu:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

Tanpa melakukan hal di atas, saya mendapatkan django.core.exceptions.AppRegistryNoReadykesalahan.

File skrip saya berada di direktori yang sama dengan proyek Django saya (mis. Dalam folder yang sama dengan manage.py)


2
Pengaturan saya memiliki file pengaturan yang telah dirujuk dalam DJANGO_SETTINGS_MODULEvariabel lingkungan. Dengan itu cukup hanya: di import django ; django.setup()bawah 1,7.
Taylor Edmiston

1
Dengan django 1.7+ ini harusnya menjadi jawaban yang diterima :)
acidjunk

Ini jelas merupakan jawaban yang benar untuk Django 1.9.x. Tidak berjalan django.setup()tidak akan membiarkan skrip mengakses model Django, bahkan tidak mengimpornya!
glarrain

Dalam virtualenv Anda dapat dengan mudah import django; django.setup().
User3759685

1
Anda membuat hari saya! Terima kasih untuk posting ini. saya semakin menyeramkan pada seledri karena saya tidak dapat menjalankan tugas ke management.call_command: D: D: D

68

Saya terlambat ke pesta, tetapi saya berharap tanggapan saya akan membantu seseorang: Anda dapat melakukan ini dalam skrip Python Anda:

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

sisa barangmu ada di sini ....


3
Perhatikan juga bahwa Anda dapat membuang sys.path.appendbarang - barang selama Anda melakukannya dengan DJANGO_SETTINGS_MODULESbenar (mis. Jika Anda memiliki skrip yang berada tepat di atas root situs Anda, Anda dapat melakukannya os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
mgalgs

Saya akhirnya melakukannya sys.path.append(os.getcwd()), ini berfungsi ketika saya berada di dalam direktori proyek saya, DJANGO_SETTINGS_MODULE saya benar dan saya mencoba menjalankan skrip yang mengimpor model, tampilan, dll.
Danilo Cabello

ya tetapi Anda tidak dapat menjalankannya dari mana saja!
e-nouri

Ini tidak berfungsi untuk saya dengan Django 1.6 - Saya punya aplikasi. Saya telah menetapkan jalur saya untuk memasukkan direktori proyek Django dan mengatur pengaturan proyek. Tetapi ketika saya mencoba dan mengimpor aplikasi saya dengan "dari shoppinglist.models import ShoppingList" saya mendapat kesalahan karena tidak dapat menemukan model. Jalur impor yang sama berfungsi dari dalam shell manage.py. Ada ide?
Frankrank

33

runscriptdari django-extensions

python manage.py runscript scripty.py

Sampel script.pyuntuk mengujinya:

from django.contrib.auth.models import User
print(User.objects.values())

Disebutkan di: http://django-extensions.readthedocs.io/en/latest/command_extensions.html dan didokumentasikan di:

python manage.py runscript --help

Ada tutorial juga .

Diuji pada Django 1.9.6, Django-extensions 1.6.7.


1
Ini adalah jawaban terbaik jika Anda sudah menggunakan django-extensions(Anda harus). Catatan: Sepertinya runscriptmenggunakan Django standar shell. Akan luar biasa jika digunakan shell_plus(juga dalam ekstensi) sehingga Anda tidak perlu mengimpor semuanya untuk skrip sederhana.
grokpot

12

Jika IPython tersedia ( pip install ipython) maka ./manage.py shellsecara otomatis akan menggunakan shell itu dan kemudian Anda dapat menggunakan perintah ajaib %run:

%run my_script.py

Bekerja seperti pesona!
Roel

Ini memiliki keunggulan dibandingkan runscriptdengan skrip yang bekerja di luar proyek / paket dan tidak mengeluh seperti iniTypeError: the 'package' argument is required to perform a relative import for
smido

8

Anda bisa menjalankan skrip dengan DJANGO_SETTINGS_MODULEset variabel lingkungan. Hanya itu yang diperlukan untuk mengatur lingkungan Django-shell.

Ini berfungsi di Django> = 1.4


7

@AtulVarma memberikan komentar yang sangat berguna di bawah jawaban diterima yang tidak berfungsi :

echo 'import myscript' | python manage.py shell

jawaban bagus! Saya melewatkannya di komentar. Terima kasih telah meletakkannya di sini
Anupam

6

jika Anda tidak memiliki banyak perintah dalam skrip Anda gunakan:

manage.py shell --command="import django; print(django.__version__)"

Django docs


4

Seperti yang ditunjukkan oleh jawaban lain tetapi tidak secara eksplisit menyatakan, apa yang sebenarnya Anda butuhkan tidak harus mengeksekusi skrip Anda dari Django shell, tetapi untuk mengakses aplikasi Anda tanpa menggunakan shell Django .

Ini berbeda banyak versi Django ke versi Django. Jika Anda tidak menemukan solusi di utas ini, jawab di sini - skrip Django untuk mengakses objek model tanpa menggunakan manage.py shell - atau pencarian serupa dapat membantu Anda.

Saya harus memulai my_command.py dengan

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

lalu berlari python3 my_command.py

(Django 2.0.2)


Ini masih berfungsi untuk Django 3.0. Saya diganti sys.path.append('/path/to/myproject')dengan BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))dan `sys.path.append (BASE_DIR)`. Juga jangan lupa untuk mengaktifkan env virtual Anda sebelum menjalankan perintah!
mrj

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

django.setup()

1
Bisakah Anda mengedit penjelasan mengapa kode ini menjawab pertanyaan dengan cara yang berbeda dari beberapa jawaban sebelumnya yang sangat mirip? Jawaban hanya kode tidak disarankan , karena mereka tidak mengajarkan solusi.
Nathan Tuggy

2

Catatan, metode ini telah usang untuk versi Django yang lebih baru! (> 1.3)

Jawaban alternatif, Anda dapat menambahkan ini ke atas my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

dan jalankan my_script.pyhanya dengan python di direktori di mana Anda memiliki settings.pytetapi ini agak hacky.

$ python my_script.py

1

Jika Anda ingin menjalankan di BG lebih baik lagi:

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

Outputnya akan masuk nohup.out



0

Coba ini jika Anda menggunakan lingkungan virtual: -

shell python manage.py

untuk menggunakan perintah itu, Anda harus berada di dalam lingkungan virtual. untuk penggunaan ini: -

workon vir_env_name

sebagai contoh :-

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)
>>> 

Catatan : - Di sini situs saya adalah nama situs web saya dan jango adalah nama lingkungan virtual saya


0

datang ke sini dengan pertanyaan yang sama dengan OP, dan saya menemukan jawaban favorit saya justru dalam kesalahan dalam pertanyaan, yang juga berfungsi di Python 3:

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

0

Cara lain menjalankan yang ini:

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

Ini bekerja pada Python2.7 dan Django1.9


0

Jika Anda ingin menjalankan skrip startup (mis. Mengimpor beberapa model Django untuk bekerja dengannya secara interaktif) dan tetap berada di shell Djakarta:

PYTHONSTARTUP=my_script.py python manage.py shell

0

Shell django adalah cara yang baik untuk mengeksekusi modul python dengan lingkungan django, tetapi tidak selalu mudah dan melelahkan untuk mengimpor modul dan menjalankan fungsi secara manual terutama tanpa pelengkapan otomatis. Untuk mengatasi ini, saya membuat skrip shell kecil "runningcript.sh" yang memungkinkan Anda untuk mengambil keuntungan penuh dari penyelesaian otomatis dan riwayat log dari konsol Linux.

NB: Salin runningcript.sh ke proyek root dan setel hak eksekusi (chmod + x)

Sebagai contoh: Saya ingin menjalankan fungsi python bernama show (a, b, c) di modul do_somethings.py di myapp / do_folder /

Cara django standar (kelola.py shell):

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

Dengan skrip (runningcript.sh):

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

Skrip tidak dibatasi dalam jumlah argumen. Namun hanya argumen tipe primitif yang didukung (int, float, string)


Hai, mungkin runscriptdari django-extensionspaket melakukan hal yang sama, periksa django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4

Terima kasih frost-nzcr4. Ya, memang, ekstensi ini berfungsi, tetapi saya menemukannya terbatas pada folder srcipts dan hanya untuk fungsi run (). Dengan srcipt saya, Anda dapat menjalankan fungsi di mana saja di folder mana pun.
Martin13

0

Terlambat ke pesta. Tetapi ini mungkin bermanfaat bagi seseorang.

Yang Anda butuhkan hanyalah skrip Anda dan django-extensionsdiinstal.

Jalankan saja yang shell_plustersedia didjango_extensions dan impor skrip yang telah Anda tulis.

Jika skrip Anda ada scpt.pydan di dalam folder folAnda dapat menjalankan skrip sebagai berikut.

python manage.py shell_plus

dan cukup impor skrip Anda di dalam shell sebagai berikut.

>>> from fol import scpt

-1

django.setup () tampaknya tidak berfungsi.

tampaknya tidak diperlukan juga.

ini saja berhasil.

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

1
django.setup () pasti diperlukan untuk mem-bootstrap lingkungan Django.
colm.anseo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.