2010-01-08 38 views
14

Tôi đang sử dụng ConfigParser để định cấu hình ứng dụng của mình và bây giờ tôi muốn làm cho nó dễ phân phối và đồng thời giữ nguyên khả năng cấu hình.Đóng gói các ứng dụng Python với các tệp cấu hình

Tôi nghĩ rằng tôi cần một thư mục với các mẫu tệp cấu hình và một số cách để tạo cấu hình để thực sự sử dụng các cấu hình này. Sau đó, tôi cần một nơi để lưu trữ nó sẽ làm việc trong virtualenv, thư mục nhà người dùng vv. Tôi muốn nó gần giống như cách các gói Unix bình thường hoạt động, tức là có cấu hình trong v.v. nhưng với ghi đè trong thư mục chính. Có một giải pháp readymade cho điều này, và nếu không, những gì tôi nên đặt trong setup.py của tôi vv để làm cho nó hoạt động như tôi muốn?

Trả lời

9

bạn có thể sử dụng tùy chọn data_filesdistutils để cài đặt tệp bất cứ nơi nào bạn muốn.

data_files xác định một chuỗi các (directory, files) cặp theo cách sau:

setup(..., 
     data_files=[('/etc', ['cfg/config1.ini', 'cfg/config2.ini']), 
        ('/etc/init.d', ['bin/initscript1'])], 
     .... 
    ) 

Khi đọc các tập tin cấu hình trên ứng dụng của bạn, bạn có thể hợp nhất một phiên bản /home nếu nó tồn tại, sử dụng .read() method of ConfigParser objects:

files_read = cfgparserobj.read(['/etc/config1.ini', 
           os.path.expanduser('~/.config1.ini')]) 
for fname in files_read: 
    print "Reading config from", fname 

Điều đó sẽ đọc /etc/config1.ini và sau đó ghi đè các định nghĩa có nội dung đến từ .config1.ini trong thư mục chính của người dùng, nếu nó tồn tại.

+6

Có cách nào để làm việc này tốt đẹp với virtualenv không? I E. tôi nên chỉ định đường dẫn nào để đặt nội dung trong myvirtenv/etc/myconf.ini? –

+4

Tôi biết đây là một bài đăng cũ, nhưng vẫn có thể hữu ích. @ JoakimLundborg: bạn có thể sử dụng '' sys.prefix'', theo mặc định ''/usr'' và đường dẫn của virtualenv trong trường hợp của bạn (với tiền tố thực trong '' sys.real_prefix'' – linkdd

+0

Sử dụng sys .real_prefix có vẻ rất hứa hẹn, nó cũng sẽ yêu cầu một cách để có được cùng một vị trí trong thời gian chạy để đọc các tập tin cấu hình từ đó, có thể cùng được sử dụng cho mục đích đó? – a1an

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