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.
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.
Jawaban:
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())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
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.py
perintah.
Get-Content myscript.py | .\manage.py shell
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 management
dan commands
Anda 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
NoArgsCommand
sudah ditinggalkan. Halaman ini memberikan contoh yang bermanfaat: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
ke def handle(self, **options):
.
def handle(self, **options):
komentar James.
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.AppRegistryNoReady
kesalahan.
File skrip saya berada di direktori yang sama dengan proyek Django saya (mis. Dalam folder yang sama dengan manage.py)
DJANGO_SETTINGS_MODULE
variabel lingkungan. Dengan itu cukup hanya: di import django ; django.setup()
bawah 1,7.
django.setup()
tidak akan membiarkan skrip mengakses model Django, bahkan tidak mengimpornya!
import django; django.setup()
.
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 ....
sys.path.append
barang - barang selama Anda melakukannya dengan DJANGO_SETTINGS_MODULES
benar (mis. Jika Anda memiliki skrip yang berada tepat di atas root situs Anda, Anda dapat melakukannya os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
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.
runscript
dari django-extensions
python manage.py runscript scripty.py
Sampel script.py
untuk 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
Diuji pada Django 1.9.6, Django-extensions 1.6.7.
django-extensions
(Anda harus). Catatan: Sepertinya runscript
menggunakan Django standar shell
. Akan luar biasa jika digunakan shell_plus
(juga dalam ekstensi) sehingga Anda tidak perlu mengimpor semuanya untuk skrip sederhana.
Jika IPython tersedia ( pip install ipython
) maka ./manage.py shell
secara otomatis akan menggunakan shell itu dan kemudian Anda dapat menggunakan perintah ajaib %run
:
%run my_script.py
runscript
dengan skrip yang bekerja di luar proyek / paket dan tidak mengeluh seperti iniTypeError: the 'package' argument is required to perform a relative import for
Anda bisa menjalankan skrip dengan DJANGO_SETTINGS_MODULE
set variabel lingkungan. Hanya itu yang diperlukan untuk mengatur lingkungan Django-shell.
Ini berfungsi di Django> = 1.4
@AtulVarma memberikan komentar yang sangat berguna di bawah jawaban diterima yang tidak berfungsi :
echo 'import myscript' | python manage.py shell
jika Anda tidak memiliki banyak perintah dalam skrip Anda gunakan:
manage.py shell --command="import django; print(django.__version__)"
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)
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!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
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.py
hanya dengan python di direktori di mana Anda memiliki settings.py
tetapi ini agak hacky.
$ python my_script.py
Sesuatu yang baru saja saya temukan menarik adalah Django Scripts, yang memungkinkan Anda menulis skrip untuk dijalankan dengan python manage.py runcript foobar. Informasi lebih rinci tentang implementasi dan memo dapat ditemukan di sini, http://django-extensions.readthedocs.org/en/latest/index.html
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
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
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)
runscript
dari django-extensions
paket melakukan hal yang sama, periksa django-extensions.readthedocs.io/en/latest/runscript.html
Terlambat ke pesta. Tetapi ini mungkin bermanfaat bagi seseorang.
Yang Anda butuhkan hanyalah skrip Anda dan django-extensions
diinstal.
Jalankan saja yang shell_plus
tersedia didjango_extensions
dan impor skrip yang telah Anda tulis.
Jika skrip Anda ada scpt.py
dan di dalam folder fol
Anda dapat menjalankan skrip sebagai berikut.
python manage.py shell_plus
dan cukup impor skrip Anda di dalam shell sebagai berikut.
>>> from fol import scpt
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")
django
kerjanya, apa yang sebenarnya ingin Anda lakukan?