Django kabuğundan bir Python betiği nasıl çalıştırılır?


247

Django kabuğundan bir Python betiği yürütmem gerekiyor. Denedim:

./manage.py shell << my_script.py

Ama işe yaramadı. Sadece bir şeyler yazmamı bekliyordu.


Bu nasıl djangoçalışır, aslında ne yapmak istiyorsunuz?
danodonovan

2
my_script.pyDjango modellerimden birinde birkaç işlem içeriyor. Bunu daha önce yaptım ama tam olarak nasıl olduğunu hatırlayamıyorum.

Yanıtlar:


388

<<Bölüm yanlış, kullanmak <yerine:

$ ./manage.py shell < myscript.py

Ayrıca şunları da yapabilirsiniz:

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

Python3 için kullanmanız gerekir

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

17
Benim için bu sadece betiğin ilk satırını yürütür. ./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett

Artık Python 3+ ile çalışmaz. Bunu değiştirmek için herhangi bir fikrin var mı?
David

4
@DavidD. Değiştirme burada
peter2108

11
Hem Python 2.x hem de 3.x için çalışıyor gibi görünen başka bir çözümdür echo 'import myscript' | python manage.py shell. Bunun, bir manage.pykomut oluşturmanın hantal sürecinden geçmek zorunda kalmadan, yalnızca bir kez çalıştırmanız gereken hızlı ve kirli komut dosyaları için yararlı olabileceğini gördüm .
Atul Varma

1
bunu Windows güç kabuğunda yapıyorsanız: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

Sen o yapılması tavsiye değiliz shell- ve gerçekten Django ortamından rastgele komut dosyalarını yürütme edilmelidir olarak bu tasarlanmıştır (ama orada vardır , diğer yanıtları görmek Bu etrafında yolu).

Bu birden fazla kez şekilde çalışacaktır bir senaryo ise, bu iyi bir fikir bir şekilde kurmak için var özel komut yani

 $ ./manage.py my_command

Bunu yapmanın bir alt dizinindeki bir dosya oluşturun managementve commandssenin içinde app, yani

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

ve bu dosyada özel komutunuzu tanımlayın (dosya adının yürütmek istediğiniz komutun adı olduğundan emin olun ./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
Yine bu en iyi cevap. Django 1.8 NoArgsCommandkullanımdan kaldırıldığı için. Bu sayfa çalışan bir örnek veriyor: docs.djangoproject.com/tr/1.9/howto/custom-management-commands/…
Ger

2
Önceki yoruma göre, benim için çalışması için değiştirmek def handle_noargs(self, **options):gerekiyordu def handle(self, **options):.
James

İlginç bağlantı burada bu cevap ve belgelere destek verildi.
Mattia Paterna

1
Çalışması için def handle(self, **options):James'in yorumu olarak değiştirin .
Omar Gonzales

Zarif cevap. Çok teşekkürler
Tessaracter

103

Django 1.7+ kullanan herkes için, sadece ayarlar modülünü içe aktarmak yeterli değildir.

Biraz kazdıktan sonra, bu Yığın Taşması cevabını buldum: https://stackoverflow.com/a/23241093

Şimdi yapmanız gerekenler:

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

Yukarıdakileri yapmadan bir django.core.exceptions.AppRegistryNoReadyhata alıyordum .

Betik dosyam, django projemle aynı dizinde (yani, manage.py ile aynı klasörde)


2
Kurulumumda DJANGO_SETTINGS_MODULEortam değişkeninde zaten başvurulan ayarlar dosyası var . Bununla sadece import django ; django.setup()1.7'nin altında yeterliydi .
Taylor Edmiston

1
Django 1.7+ ile bu kabul edilen cevap olmalı :)
acidjunk

Bu kesinlikle Django 1.9.x için doğru cevaptır. Çalışmıyor django.setup()komut dosyası erişim Django modellerini izin vermez, hatta onları içe!
glarrain

Bir sanal ortamda basitçe yapabilirsiniz import django; django.setup().
Kullanıcı3759685

1
Günümü gün ettin! Bu gönderi için teşekkürler. yönetimi üzerine görevleri

68

Partiye geç kaldım ama umarım cevabım birisine yardım eder: Bunu Python betiğinizde yapabilirsiniz:

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

geri kalan şeyler buraya gider ....


3
Ayrıca damla unutmayın sys.path.appendAlacağınız uzun olduğunca şeyler DJANGO_SETTINGS_MODULES(sadece yapabileceğiniz sitenizin kökü yukarıda oturan bir komut dosyası varsa mesela sağa os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
Mart'ta Mgalgs

Yaptığım bitti sys.path.append(os.getcwd())benim proje dizin içinde olduğum zaman çalışır, benim DJANGO_SETTINGS_MODULE doğru olduğunu ve bunu ithalat modelleri, görünümler, vb bir komut dosyası çalıştırmayı deneyin
Danilo Cabello

evet ama hiçbir yerden çalıştıramazsın!
e-nouri

Bu benim için django 1.6 ile işe yaramıyor - Bir uygulama var. Django proje dizinini dahil etmek ve proje ayarlarını yapmak için yolumu ayarladım. Ancak "shoppinglist.models import ShoppingList" ile uygulamamı içe aktarmaya çalıştığımda, modelleri bulamadığı bir hata alıyorum. Aynı içe aktarma satırı manage.py kabuğundan da çalışır. Herhangi bir fikir?
frankster

33

runscriptdan django-uzantılarına

python manage.py runscript scripty.py

script.pyTest etmek için bir örnek :

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

Http://django-extensions.readthedocs.io/en/latest/command_extensions.html adresinde bahsedildi ve şu adreste belgelendi:

python manage.py runscript --help

Bir de öğretici var .

Django 1.9.6, django uzantıları 1.6.7'de test edilmiştir.


1
Zaten kullanıyorsanız en iyi cevap budur django-extensions(yapmanız gerekir). Not: runscriptStandart django kullanıyor gibi görünüyor shell. shell_plusBasit uzantılar için her şeyi içe aktarmanız gerekmediği için (uzantılarda da) harika olurdu .
grokpot

12

IPython varsa ( pip install ipython) ./manage.py shell, otomatik olarak kabuğunu kullanır ve magic komutunu kullanabilirsiniz %run:

%run my_script.py

Bir cazibe gibi çalıştı!
Roel

Bu, runscriptproje / paket dışındaki komut dosyalarıyla çalıştığı ve böyle şikayet etmediği avantajına sahiptirTypeError: the 'package' argument is required to perform a relative import for
smido

8

Betiği sadece DJANGO_SETTINGS_MODULEortam değişkeni kümesiyle çalıştırabilirsiniz. Django-shell ortamını kurmak için gereken tek şey bu.

Bu Django'da çalışır> = 1.4


7

@AtulVarma, çalışmayan kabul edilen cevap altında çok yararlı bir yorum yaptı :

echo 'import myscript' | python manage.py shell

mükemmel cevap! Yorumlarda kaçırdım. Buraya koyduğunuz için teşekkürler
Anupam


4

Diğer yanıtların belirttiği ancak açıkça belirtmediği gibi, aslında ihtiyacınız olabilecek şey komut dosyanızı Django kabuğundan yürütmek değil, Django kabuğunu kullanmadan uygulamalarınıza erişmek .

Bu çok Django sürümünü Django sürümüne göre değişir. Çözümünüzü bu iş parçacığında bulamazsanız, burada yanıtlar - manage.py shell kullanmadan model nesnelere erişmek için Django komut dosyası - veya benzer aramalar size yardımcı olabilir.

My_command.py ile başlamak zorunda kaldım

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

ve sonra koştu python3 my_command.py

(Django 2.0.2)


Bu hala Django 3.0 için çalışıyor. Bunun değiştirilmesi sys.path.append('/path/to/myproject')ile BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))ve 'sys.path.append (BASE_DIR) `. Komutu çalıştırmadan önce sanal ortamınızı etkinleştirmeyi de unutmayın!
mrj

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

django.setup()

1
Eğer memnun Could düzenleme bu kod çok benzer önceki bazı yanıtlar ülkeden farklı bir şekilde soru cevaplar neden bir açıklama? Sadece kod yanıtları önerilmez , çünkü çözümü öğretmezler.
Nathan Tuggy

2

Bu yöntemin django! Nun daha yeni sürümleri için kullanımdan kaldırıldığını unutmayın. (> 1.3)

Alternatif bir cevap olarak, bunu my_script.py

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

ve my_script.pysadece sahip olduğunuz dizinde python ile çalıştırın settings.pyama bu biraz hileli.

$ python my_script.py

1

BG'de daha iyi koşmak istiyorsanız:

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

Çıktı nohup.out



0

Sanal ortam kullanıyorsanız bunu deneyin: -

python manage.py kabuk

bu komutu kullanmak için sanal ortamın içinde olmalısınız. bu kullanım için: -

workon Instagram Hesabındaki Resim ve Videoları vir_env_name

Örneğin :-

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

Not : - Burada sitem benim web sitemin adı ve jango benim sanal çevre adım


0

Buraya OP ile aynı soru ile geldi ve en sevdiğim cevabı Python 3'te de çalışan sorudaki hatada tam olarak buldum:

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

0

Aksi takdirde bunu yürütmek:

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

Bu Python2.7 ve Django1.9 üzerinde çalışıyor


0

Başlangıç ​​komut dosyasını yürütmek (örn. Onlarla etkileşimli olarak çalışmak için bazı django modellerini içe aktarmak) ve django kabuğunda kalmak istiyorsanız:

PYTHONSTARTUP=my_script.py python manage.py shell

0

Django kabuğu, django ortamıyla bir python modülü yürütmenin iyi bir yoludur, ancak özellikle otomatik tamamlama olmadan modülleri almak ve işlevleri manuel olarak yürütmek her zaman kolay ve yorucu değildir. Bu sorunu çözmek için , Linux konsolu otomatik tamamlama ve günlük geçmişinden tam olarak yararlanmanızı sağlayan küçük bir kabuk komut dosyası "runscript.sh" oluşturdum.

Not: runscript.sh dosyasını kök projeye kopyalayın ve yürütme hakkını ayarlayın (chmod + x)

Örneğin: myapp / do_folder / içindeki do_somethings.py modülünde show (a, b, c) adlı python işlevini çalıştırmak istiyorum

Standart django yolu (manage.py shell):

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

Komut dosyasıyla (runscript.sh):

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

Komut dosyası, bağımsız değişken sayısı ile sınırlı değildir. Ancak yalnızca ilkel tür argümanları desteklenir (int, float, string)


Merhaba, muhtemelen runscriptgelen django-extensionspaketin, aynı kontrol edebilirim django-extensions.readthedocs.io/en/latest/runscript.html
dona nzcr4

Teşekkürler frost-nzcr4. Evet, aslında, bu uzantı çalışır, ancak srcipts klasörü ve yalnızca run () işlevi ile sınırlı buluyorum. Srcipt'imle, herhangi bir klasörde herhangi bir yerde bir işlev yürütebilirsiniz.
Martin13

0

Partiye geç. Ancak bu birisi için yararlı olabilir.

Tek ihtiyacınız olan komut dosyanız ve django-extensionsyüklü.

Sadece koşmak shell_plusmevcut in django_extensionsve yazdığınız o senaryoyu içe.

Betiğiniz varsa scpt.pyve bir klasörün içindeyse folbetiği aşağıdaki gibi çalıştırabilirsiniz.

python manage.py shell_plus

ve betiğinizi kabuğun içine aşağıdaki gibi aktarmanız yeterlidir.

>>> from fol import scpt

-1

django.setup () çalışmıyor.

gerekli de görünmüyor.

bu yalnız işe yaradı.

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

1
django.setup () kesinlikle Django ortamını önyüklemek için gereklidir.
colm.anseo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.