2009-08-21 24 views
34

Django ORM özelliklerini kullanan diğer bir dış kütüphanenin yanında, Django dışında çalışmak istediğim (yani komut satırından çalıştırılan) bir komut dosyası var.Django'nun dışında bir Python betiği çalıştırmak

Düzenleme: Şu anda, ben ... bir URL'ye giderek

başlatabilirsiniz nasıl kurulum bunun için ortam mı?

+0

Olası yinelenen Django kabuğundan komut dosyası] (http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell) –

+0

En temiz çözümlerden biri burada verilen çözümdür: ht tps: //stackoverflow.com/a/39724171/4454597 –

cevap

20
from <Project path>   import settings   #your project settings file 
from django.core.management import setup_environ  #environment setup function 

setup_environ(settings) 

#Rest of your django imports and code go here 
+0

Maalesef bu yöntemi, \ app1 \ dosyasında bir komut dosyası kullanırsanız ve proje köküne yerleştirmedikçe \ app2 \ 'den dosyaları kullanmanız gerekiyorsa çalışmaz. –

+1

"Import setup_environment" yerine "import setup_environ" olması gerektiğini düşünüyorum. – del

+1

Bu, Django 1.4'te uzun süre önce kullanımdan kaldırıldı. – mlissner

13

İhtiyacınız olan tek şey, içe aktarma ayarlarıdır ve uygun şekilde python yolunu belirler. En ham formda aşağıdaki gibi uygun ortam değişkenleri kurarak yapılabilir:

$ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py 

settings.configure() arama ve zaten some blog post yılında James Bennett tarafından setup_environ() tarif sözü gibi başka yolları vardır.

+1

+1: Bunu her zaman yapın. ORM'yi kullanan birçok toplu işimiz var. –

+0

"myscript.py" dosyasında basit bir model içe aktarılacak mı? – jgomo3

38

Bunu yapmanın en kolay yolu, komut dosyanızı manage.py alt komutu olarak kurmaktır. Bunu yapmak oldukça kolay:

from django.core.management.base import NoArgsCommand, make_option 

class Command(NoArgsCommand): 

    help = "Whatever you want to print here" 

    option_list = NoArgsCommand.option_list + (
     make_option('--verbose', action='store_true'), 
    ) 

    def handle_noargs(self, **options): 
     ... call your script here ... 

yönetimi/komutları altında uygulamalarının herhangi birinde, bir dosyaya koy/./manage.py yourcommand ile ve şimdi çağrı Senaryonuzun (boş __init__.py her dosyalarla) yourcommand.py.

+0

Komutun projenizle ilgili olduğu varsayılarak kullanıyorum. – DaveJ

+1

"NameError: name 'make_option' tanımlı değilken" hata oluştu "hatası alıyorum - eksik bir şey mi var? –

+3

Muhtemelen en üstte optparse import make_option' den 'gerekir. –

10

Not, ayarları içe aktarma ve setup_environ kullanma önerileri Django 1.4 ile kullanımdan kaldırılmıştır.

Django Github üzerinde why this was done tanımlayan bir iş parçacığı var.

Yine de başka seçenekler var ama bunların çoğu bana hacklenmiş görünüyor. Benim tercih edilen yöntem django-extensions bir extended command of manage.py

10

olarak metne fonksiyonu içerecek şekilde sık sık kullanın runscript geçerli:

  1. pip install django-extensions
  2. bir dizin oluşturun: python manage.py runscript <my_script>

    Bunu yapmak için aşağıdakileri yapmanız gerekir scripts denir. Bu, kök dizininizde veya belirli bir uygulamada bulunabilir. Bu dizinde

    touch scripts/__init__.py

  3. yerleştirin komut ve run() fonksiyonu içerir:

  4. boş init dosyası ile dizini başlatın. Örnek:
    #hello.py 
    
    def hello(): 
        return "Hello, World" 
    
    def run(): 
        print hello() 
    
  5. python manage.py runscript hello

ile komut dosyasını çalıştırın fazla ayrıntı için docs ve helpful blog post bakınız.

+0

python ile çalışmaz 3.6. –

1

benim projelerine aşağıdaki komutu eklemek ister:

myproject/management/commands/run-script.py:

from django.core.management.base import BaseCommand, CommandError 

import imp 
import sys 


class Command(BaseCommand): 

    help = """Run a non-django script with django settings.""" 
    args = "<path_to_script.py> [<script_args>...]" 

    def handle(self, *args, **options): 
     if len(args) == 0: 
      raise CommandError("Path to script to run is required") 
     sys.argv = list(args) 
     imp.load_source("__main__", args[0]) 

Sonra ben özel komut çalıştırabilirsiniz, örneğin: [Python Yürütülmesinden

./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2 
İlgili konular