2009-08-21 44 views
34

Tôi có một tập lệnh sử dụng các tính năng ORM của Django, trong số các thư viện bên ngoài khác, mà tôi muốn chạy bên ngoài Django (có nghĩa là, được thực thi từ dòng lệnh).Chạy tập lệnh Python bên ngoài Django

Chỉnh sửa: Hiện tại, tôi có thể khởi chạy bằng cách điều hướng đến URL ...

Làm cách nào để thiết lập môi trường cho điều này?

+0

có thể trùng lặp của [Thi Python script từ Django shell] (http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell) –

+0

Một trong những giải pháp sạch nhất là một trong những cung cấp ở đây: ht tps: //stackoverflow.com/a/39724171/4454597 –

Trả lời

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

Thật không may phương pháp này không hoạt động nếu bạn sử dụng tập lệnh trong \ app1 \ và cần sử dụng tệp từ \ app2 \ trừ khi bạn đặt nó vào thư mục gốc của dự án. –

+1

Tôi nghĩ rằng nó nên là "import setup_environ" thay vì "import setup_environment" – del

+1

Điều này đã không được chấp nhận trong Django 1.4 ... từ lâu. – mlissner

13

Tất cả những gì bạn cần là cài đặt có thể nhập và đặt đúng đường dẫn python. Trong dạng thô nhất này có thể được thực hiện bằng cách thiết lập các biến môi trường thích hợp, như:

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

Có nhiều cách khác, giống như gọi settings.configure() và đã được đề cập setup_environ() mô tả bởi James Bennett trong some blog post.

+1

+1: Làm điều này mọi lúc. Chúng tôi có nhiều công việc hàng loạt sử dụng ORM. –

+0

Một mô hình nhập khẩu đơn giản trong "myscript.py" có hoạt động không? – jgomo3

38

Cách dễ nhất để thực hiện việc này là thiết lập tập lệnh của bạn làm tiểu mục manage.py. Đó là khá dễ dàng để làm:

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

Đặt điều này trong một tập tin, trong bất kỳ ứng dụng của bạn thuộc quyền quản lý/lệnh/yourcommand.py (với trống __init__.py tập tin trong mỗi) và bây giờ bạn có thể gọi kịch bản của bạn với ./manage.py yourcommand.

+0

Đây là tùy chọn mà tôi sử dụng, giả sử lệnh có liên quan đến dự án của bạn. – DaveJ

+1

Tôi nhận được lỗi "NameError: name 'make_option' không được xác định" khi chạy cái này - có cái gì đó bị thiếu? –

+3

Bạn có thể cần 'từ optparse import make_option' ở trên cùng. –

10

Lưu ý rằng các đề xuất xung quanh việc nhập cài đặt và sử dụng setup_environ đã không được dùng nữa với Django 1.4.

Có một chuỗi trên Gango Django mô tả why this was done.

Vẫn còn một số tùy chọn khác ngoài đó nhưng nhiều tùy chọn dường như có thể gây hại cho tôi. phương pháp ưa thích của tôi thường là bao gồm các chức năng kịch bản như một extended command of manage.py

10

Sử dụng runscript từ django-extensions: python manage.py runscript <my_script>

Để làm điều này, bạn cần phải:

  1. pip install django-extensions
  2. Tạo một thư mục được gọi là scripts. Điều này có thể được đặt trong thư mục gốc của bạn hoặc trong một ứng dụng cụ thể.
  3. Khởi tạo thư mục với file init trống:

    touch scripts/__init__.py

  4. Nơi kịch bản của bạn trong thư mục này, và bao gồm một chức năng run(). Ví dụ:

    #hello.py 
    
    def hello(): 
        return "Hello, World" 
    
    def run(): 
        print hello() 
    
  5. Chạy tập lệnh có python manage.py runscript hello

Tham khảo docshelpful blog post để biết thêm chi tiết.

+0

không hoạt động với python 3.6. –

1

Tôi muốn thêm lệnh sau để dự án của tôi:

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

Sau đó, tôi có thể chạy các kịch bản tùy chỉnh, ví dụ:

./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2 
Các vấn đề liên quan