2008-09-02 27 views
19

Tôi đã viết một gói Python bao gồm cơ sở dữ liệu bsddb của các giá trị được tính trước cho một trong các tính toán tốn nhiều thời gian hơn. Để đơn giản, kịch bản cài đặt của tôi cài đặt tệp cơ sở dữ liệu trong cùng thư mục với mã truy cập cơ sở dữ liệu (trên Unix, giống như /usr/lib/python2.5/site-packages/mypackage/).Tìm tệp trong phân phối mô-đun Python

Làm cách nào để lưu trữ vị trí cuối cùng của tệp cơ sở dữ liệu để mã của tôi có thể truy cập? Ngay bây giờ, tôi đang sử dụng một hack dựa trên __file__ biến trong các mô-đun mà truy cập vào cơ sở dữ liệu:

 
dbname = os.path.join(os.path.dirname(__file__), "database.dat") 

Nó hoạt động, nhưng có vẻ như ... hackish. Có cách nào tốt hơn để làm điều này? Tôi muốn có kịch bản thiết lập chỉ cần lấy vị trí cài đặt cuối cùng từ các mô-đun distutils và thứ nó vào một tập tin "dbconfig.py" được cài đặt cùng với mã truy cập cơ sở dữ liệu.

+0

phân phối dữ liệu trong python luôn là một nỗi đau. Tôi đồng ý với câu hỏi của bạn mặc dù tôi đã không tìm thấy bất kỳ giải pháp tốt hơn. –

Trả lời

4

Đó có thể là cách để làm điều đó, mà không cần đến một thứ gì đó nâng cao hơn như sử dụng công cụ thiết lập để cài đặt các tệp mà chúng thuộc về.

Thông báo có vấn đề với cách tiếp cận đó, vì trên hệ điều hành có khung bảo mật thực (UNIX, v.v.) người dùng chạy tập lệnh của bạn có thể không có quyền truy cập DB trong thư mục hệ thống nơi cài đặt.

23

Hãy thử sử dụng pkg_resources, mà là một phần của setuptools (và có sẵn trên tất cả các con trăn Tôi có quyền truy cập vào ngay bây giờ):

>>> import pkg_resources 
>>> pkg_resources.resource_ filename(__name__, "foo.config") 
'foo.config' 
>>> pkg_resources.resource_filename('tempfile', "foo.config") 
'/usr/lib/python2.4/foo.config' 

Có thảo luận thêm về cách sử pkg_resources để có được tài nguyên trên trang eggs và trang pkg_resources. Cũng cần lưu ý, nếu có thể, bạn nên sử dụng pkg_resources.resource_stream hoặc pkg_resources.resource_string vì nếu gói là một phần của trứng, resource_filename sẽ sao chép tệp vào một thư mục tạm thời.

+1

Điều này làm cho gói của bạn phụ thuộc vào 'settools', không có trong thư viện chuẩn. –

+3

@techtonik Đáng buồn thay, hai cách tiêu chuẩn để truy cập tài nguyên là sử dụng các disutils hoặc setuptools. Không có cách nào để truy cập tài nguyên trong một mô-đun chỉ sử dụng các thư viện chuẩn. Điều này một phần là do thực tế khó xây dựng một mô-đun phân phối rộng rãi mà không có thư viện bên ngoài. – theJollySin

+3

Điều này bây giờ là câu trả lời righ kể từ khi setuptools là một phần pip và gần đây Python có Ensure_pip. –

10

Sử dụng pkgutil.get_data. Đó là anh em họ của pkg_resources.resource_stream, nhưng trong thư viện chuẩn, và nên làm việc với các cài đặt hệ thống tệp phẳng cũng như các gói nén và các nhà nhập khẩu khác.

+0

Tôi mạnh mẽ thích điều này hơn bằng cách sử dụng pkg_resources, vì pkgutil luôn luôn có sẵn, và bởi vì pkg_resources dường như kích hoạt giải nén một quả trứng nén trong thư mục $ PYTHON_EGG_CACHE, loại đánh bại mục đích có trứng nén ... –

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