2013-01-08 24 views
5

Đây sẽ là một câu hỏi rất phổ biến đối với các nhà phát triển đã sử dụng "setup.py" để xây dựng các gói cài đặt và nó nên được hỏi trước nhưng tôi không thể tìm thấy câu trả lời đúng ở bất kỳ đâu.Bất kỳ hàm python nào để lấy thư mục gốc "data_files"?

Trong setup.py

from distutils.core import setup 
setup(
    ...., 
    ...., 
    data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])], 
    ...., 
    ...., 
    ) 

Kết quả sudo python setup.py cài đặt

running install 
running build 
running build_py 
running build_scripts 
running install_lib 
running install_scripts 
running install_data 
creating /usr/local/MyApp/CBV 
copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV 
copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV 
running install_egg_info 
Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info 
Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info 

Từ quan sát sử dụng kết quả trên, "/ usr/local" là thư mục gốc "data_files". Khác với mã hóa cứng, có bất kỳ hàm Python nào có thể cung cấp cho tôi thư mục gốc "data_files" này không?

Với gợi ý từ Martijn Pieters, đây là giải pháp của tôi

Trong setup.py

from setuptools import setup 
setup(
    ...., 
    ...., 
    package=['myapp'], 
    package_data={'': ['data/CBV/*.cbv']}, 
    ...., 
    ...., 
    ) 

Cách sử dụng

import pkg_resources 

my_data_file = pkg_resources.resource_filename(__name__, 'data/CBV/test.cbv') 
print my_data_file 

Trả lời

6

Theo mặc định, khi cài đặt một gói phần mềm dưới dạng root, đường dẫn dữ liệu được dựa trên sys.prefix cộng với tên dự án của bạn, tôi tin rằng, vì vậy bạn có thể truy xuất tệp dựa trên đó.

Bạn nên sử dụng phần mở rộng setuptools để distutils và sử dụng pkg_resources module Resource API để tải các tệp dữ liệu. Nó đi kèm với setuptools cho mục đích này.

Bạn muốn các tệp dữ liệu của mình được bao gồm trong gói để hoạt động tốt nhất. Xem Including data files (trong tài liệu về thiết lập).

Sau đó bạn có thể tải các file tài nguyên với thẳng vào một chuỗi với resource_string ví dụ:

from pkg_resources import resource_string 

foo_config = resource_string(__name__, 'foo.conf') 
+0

Hiện nay, tôi đang sử dụng "thiết lập" từ "distutils". Có thể mất một lúc để kiểm tra xem giải pháp của bạn có thể giúp tôi không :) –

+0

@JessadaThutkawkorapin: Việc chuyển sang 'setuptools' đủ dễ dàng. :-) Nó tương thích ngược với 'distutils', và chắc chắn có thể đề xuất! –

+0

Trong khi tôi đang tìm kiếm sự khác biệt giữa disutils và setuptools, tôi đã tìm thấy http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-and-setuptools. Từ những gì tôi đã đọc gần, có vẻ như gợi ý đang hướng tới disutils2. Bạn vẫn khuyên dùng setuptools? –

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