2011-09-27 43 views
43

Trong chế độ phát triển, tôi có cây thư mục sau đây:Nơi đặt tệp cấu hình bằng Python?

| my_project/ 
| setup.py 
| my_project/ 
    | __init__.py 
    | main.py 
    | conf/ 
     | myproject.conf 

tôi sử dụng ConfigParser để phân tích các tập tin myproject.conf.

Trong mã của tôi, thật dễ dàng để tải các tập tin với một con đường tốt: my_project/conf/myproject.conf

Vấn đề là: Khi tôi cài đặt dự án của tôi bằng cách sử dụng setup.py, các tập tin cấu hình nằm (nhờ setup.py) trong /etc/my_project/myproject.conf và đơn đăng ký của tôi trong số /usr/lib/python<version>/site-packages/my_project/.

Làm cách nào tôi có thể tham chiếu tệp my_project/conf/myproject.conf trong dự án của tôi ở chế độ "sản xuất" và tham khảo tệp cục bộ (my_project/conf/myproject.conf) ở chế độ "phát".

Ngoài ra, tôi muốn di chuyển nếu có thể (Làm việc trên cửa sổ chẳng hạn).

Thực tiễn tốt để làm điều đó là gì?

Trả lời

32

Bạn đã xem các tệp cấu hình hoạt động như thế nào? Đọc trên các tệp "rc", vì chúng đôi khi được gọi. "bashrc", "vimrc", v.v.

Thường có tìm kiếm nhiều bước cho tệp cấu hình.

  1. Thư mục cục bộ. ./myproject.conf.

  2. thư mục chính của người sử dụng (~user/myproject.conf)

  3. Một thư mục system-wide chuẩn (/etc/myproject/myproject.conf)

  4. Một nơi được đặt tên bởi một biến môi trường (MYPROJECT_CONF)

cài đặt Python sẽ là nơi cuối cùng để xem xét.

config= None 
for loc in os.curdir, os.path.expanduser("~"), "/etc/myproject", os.environ.get("MYPROJECT_CONF"): 
    try: 
     with open(os.path.join(loc,"myproject.conf")) as source: 
      config.readfp(source) 
    except IOError: 
     pass 
+2

Đây không phải là cách hoạt động trong Windows, tuy nhiên, câu hỏi được yêu cầu. – endolith

+1

Điều này sẽ "Làm việc trên cửa sổ".Nó có thể không phải là "điển hình" cho Windows, nhưng nó chắc chắn hoạt động. –

+1

Uh - tại sao bạn có một thử bắt xung quanh một tuyên bố với? – David

1

Tôi không nghĩ rằng có một cách sạch sẽ để giải quyết vấn đề đó. Bạn có thể chỉ đơn giản là chọn để kiểm tra sự tồn tại của tập tin 'cục bộ', mà sẽ làm việc trong chế độ dev. Nếu không, hãy quay lại đường dẫn sản xuất:

main_base = os.path.dirname(__file__) 
config_file = os.path.join([main_base, "conf", "myproject.conf"]) 

if not os.path.exists(config_file): 
    config_file = PROD_CONFIG_FILE # this could also be different based on the OS 
9

Gói appdirs thực hiện tốt công việc tìm kiếm địa điểm chuẩn cho ứng dụng đã cài đặt trên nhiều nền tảng khác nhau. Tôi tự hỏi nếu mở rộng nó để khám phá hoặc cho phép một số loại "gỡ cài đặt" trạng thái cho các nhà phát triển sẽ có ý nghĩa.

2

Một tùy chọn khác là giữ tất cả các tệp .cfg.ini trong thư mục chính, như 'boto'.

import os.path 
config_file = os.path.join(os.path.expanduser("~"), '.myproject') 
Các vấn đề liên quan