2009-08-21 113 views
34

我有一個腳本,它使用Django ORM功能以及其他外部庫,我想在Django之外運行(即從命令行執行)。在Django之外運行Python腳本

編輯:目前,我可以通過導航到一個URL啓動它...

如何設置這個環境?

+0

[執行Python的可能的複製腳本從Django殼](http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell) – 2016-06-05 10:11:08

+0

最清潔的解決方案之一是在這裏提供的:ht tps://stackoverflow.com/a/39724171/4454597 – 2017-05-26 12:12:40

回答

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

不幸的是,如果您在\ app1 \中使用腳本,並且需要使用\ app2 \中的文件,除非將其放在項目根目錄中,否則此方法不起作用。 – 2009-08-26 15:51:08

+1

我認爲它應該是「import setup_environ」而不是「import setup_environment」 – del 2010-08-24 02:20:19

+1

這在Django 1.4中已被棄用......很久以前。 – mlissner 2013-09-25 21:38:51

13

所有你需要的是可導入的設置和正確設置python路徑。在最原始的形式,這可以通過設置適當的環境變量,像這樣做:

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

還有其他的方法,比如調用settings.configure()和已經提到some blog post由詹姆斯·貝內特描述setup_environ()

+1

+1:一直這樣做。我們有許多使用ORM的批處理作業。 – 2009-08-21 10:35:56

+0

「myscript.py」中的簡單模型導入工作嗎? – jgomo3 2012-10-30 22:46:49

38

最簡單的方法是將您的腳本設置爲manage.py子命令。這是很容易做到:

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

在文件管理下的/命令將這個,在任何應用程式/ yourcommand.py(每個空__init__.py文件),並與./manage.py yourcommand現在你可以打電話給你的腳本。

+0

這是我使用的選項,假設命令與您的項目有關。 – DaveJ 2009-08-21 12:37:35

+1

運行時出現「NameError:name'make_option'未定義'錯誤 - 缺少某些內容? – 2011-12-30 13:15:09

+3

你可能需要'從頂部的optparse import make_option'。 – 2011-12-30 13:20:34

10

注意有關導入設置和使用setup_environ的建議已被Django 1.4棄用。

Django Github上有一個線程描述了why this was done

還有一些其他的選擇,但他們中的許多人似乎對我很討厭。我的首選方法往往是包括腳本函數作爲extended command of manage.py

10

使用runscriptdjango-extensionspython manage.py runscript <my_script>

爲了做到這一點,你需要:

  1. pip install django-extensions
  2. 創建一個目錄稱爲scripts。這可以位於根目錄或特定的應用程序中。
  3. 一個空白init文件初始化目錄:

    touch scripts/__init__.py

  4. 將你的腳本在這個目錄中,幷包括run()功能。例如:

    #hello.py 
    
    def hello(): 
        return "Hello, World" 
    
    def run(): 
        print hello() 
    
  5. python manage.py runscript hello

運行腳本參考docshelpful blog post的更多細節。

+0

不適用於python 3.6。 – 2017-11-23 14:15:10

1

我喜歡下面的命令添加到我的項目:

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

然後,我可以運行自定義腳本,例如:

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