2009-03-06 62 views
17

Tôi đã tạo một thư mục con của dự án Django của tôi có tên là bin nơi tôi muốn đặt tất cả các tập lệnh Python chạy bằng dòng lệnh. Một số kịch bản này cần nhập tệp dự án Django settings.py Django của tôi nằm trong thư mục cha của bin.Làm thế nào để nhập khẩu một dự án Django settings.py tập tin Python từ một thư mục con?

Làm cách nào để nhập tệp settings.py từ thư mục con của dự án?

Mã mà tôi sử dụng trong kịch bản dòng lệnh của tôi để đặt vào "Django bối cảnh" của dự án là:

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

này hoạt động tốt nếu kịch bản là trong thư mục gốc của dự án của tôi.

tôi đã cố gắng hai hacks sau để import settings.py tập tin và sau đó thiết lập dự án:

import os 
os.chdir("..") 

import sys 
sys.path = [str(sys.path[0]) + "/../"] + sys.path 

Các hack độc ác có thể nhập settings.py, nhưng sau đó tôi nhận được lỗi:

project_module = __import__(project_name, {}, {}, ['']) 
ValueError: Empty module name 

Trả lời

10

này đang diễn ra một mức so với câu hỏi của bạn, nhưng có lẽ là giải pháp tốt nhất ở đây là để thực hiện kịch bản của bạn như custom manage.py (django-admin.py) commands. Điều này cung cấp cho bạn tất cả các chức năng của Django (bao gồm cả cài đặt) miễn phí mà không có đường dẫn xấu xí, cũng như các dòng lệnh dòng lệnh như phân tích cú pháp. Tôi chưa bao giờ thấy lý do chính đáng để viết kịch bản dòng lệnh liên quan đến Django theo bất kỳ cách nào khác.

+0

Cảm ơn câu trả lời, tôi đã quá lười biếng để tra cứu thêm các lệnh quản lý trước đây, nhưng nó chỉ là những gì tôi muốn làm và giúp giữ tất cả các kịch bản của tôi ở một nơi. – MikeN

2

Add thư mục chính tới đường dẫn của bạn:

import sys 
sys.path.append('../') 
import settings 

Update từ nhận xét:

Don't forget the __init__.py file in the directory that has your settings.py – S.Lott

+0

Tôi đã cập nhật câu hỏi, vẫn có lỗi ngay cả khi settings.py nằm trong đường dẫn. – MikeN

+0

Đừng quên tệp __init__.py trong thư mục có settings.py của bạn –

+0

Có tệp __init__.py, không hoạt động. – MikeN

16

Tôi nghĩ rằng cách tiếp cận của bạn có thể quá phức tạp cái gì mà Django 1.x cung cấp cho bạn. Chừng nào dự án của bạn là trong con đường python của bạn, bạn có thể thiết lập các biến môi trường DJANGO_SETTINGS_MODULE ở phía trên cùng của kịch bản của bạn như sau:

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 

Trong kịch bản dòng lệnh của bạn, nơi bạn cần phải đọc các thiết lập của bạn, chỉ cần nhập thiết lập mô-đun từ 'django.conf' như bạn sẽ làm gì trong mã ứng dụng của bạn:

from django.conf import settings 

và mau, bạn phải thiết lập của bạn và một môi trường Django-enabled cho kịch bản của bạn.

Cá nhân tôi thích thiết DJANGO_SETTINGS_MODULE tôi sử dụng '/ usr/bin/env' trong một kịch bản bash gọi là 'proj_env' vì vậy tôi không cần phải lặp lại nó

#!/bin/bash 

proj_env="DJANGO_SETTINGS_MODULE=myproject.settings" 

/usr/bin/env $proj_env ${*} 

Với điều này, bây giờ tôi có thể chạy bất kỳ kịch bản python với ứng dụng Django của tôi trong bối cảnh:

proj_env python -m 'myproject.bin.myscript' 

Nếu bạn sử dụng virtualenv, điều này cũng cung cấp cho bạn một nơi tốt để tìm nguồn kịch bản kích hoạt.

vv vv

+0

Vì vậy, thư mục trên thư mục dự án của bạn phải nằm trong đường dẫn Python? Và thư mục dự án đang giữ settings.py phải luôn ở trong cùng một tên thư mục? Dev của tôi tên dự án khác với tên sản xuất của tôi, tên thư mục có dấu thời gian trên tên sản xuất. – MikeN

+0

Chúng tôi đặt các cài đặt của chúng tôi trong/var/this và các ứng dụng của chúng tôi trong/opt/that. PYTHONPATH của chúng tôi là "/ var/this:/opt/that". Các cài đặt riêng biệt với các ứng dụng. –

+0

Trong ví dụ trên, gói 'myproject' phải nằm trên đường dẫn python, nhưng điều đó sẽ phải ở đó để Django tìm thấy nó. Cách tiếp cận của tôi sẽ hoạt động trong môi trường dev của bạn, nhưng không chắc chắn những điều chỉnh cần thực hiện để xử lý dấu thời gian. –

Các vấn đề liên quan