2012-06-27 33 views
10

Tôi có một thư viện Python, ngoài các mô-đun Python thông thường, có một số tệp dữ liệu cần phải đi vào /usr/local/lib/python2.7/dist-package/mylibrary.setup.py không cài đặt các tệp dữ liệu

Thật không may, tôi đã không thể thuyết phục setup.py thực sự cài đặt các tệp dữ liệu tại đó. Lưu ý rằng hành vi này đang được cài đặt - không phải là sdist.

Đây là một phiên bản hơi redacted của setup.py

module_list = list_of_files 

setup(name   ='Modules', 
     version  ='1.33.7', 
     description ='My Sweet Module', 
     author  ='PN', 
     author_email ='email', 
     url   ='url', 
     packages  = ['my_module'], 

# I tried this. It got installed in /usr/my_module. Not ok. 

     # data_files = [ ("my_module", ["my_module/data1", 
     #         "my_module/data2"])] 

# This doesn't install it at all. 
     package_data = {"my_module" : ["my_module/data1", 
            "my_module/data2"] } 
    ) 

Đây là bằng Python 2.7 (sẽ phải chạy trong 2,6 cuối cùng), và sẽ phải chạy trên một số Ubuntu giữa 10,04 và 12 +. Phát triển nó ngay bây giờ vào ngày 12.04.

Trả lời

4

http://docs.python.org/distutils/setupscript.html#installing-additional-files

Nếu thư mục là một Đường dẫn tương đối, nó được hiểu tương đối so với tiền tố cài đặt (sys.prefix Python cho gói thuần Python, sys.exec_prefix đối với các gói có chứa các module mở rộng).

Điều này có lẽ sẽ làm điều đó:

data_files = [ ("my_module", ["local/lib/python2.7/dist-package/my_module/data1", 
           "local/lib/python2.7/dist-package/my_module/data2"])] 

Hoặc chỉ cần sử dụng tham gia để thêm tiền tố:

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module") 
data_files = [ ("my_module", [os.path.join(data_dir, "data1"), 
           os.path.join(data_dir, "data2")])] 
+0

Hmmm. Bất đắc dĩ để mã hóa đường dẫn, nhưng điều đó có thể phục vụ ngay bây giờ. –

+4

Tôi đã sử dụng distutils.sysconfig.get_python_lib() + "đường dẫn" và sử dụng làm khóa. –

+0

Đây không phải là cách thích hợp để làm điều đó. 'data_files' dành cho các tệp bạn muốn đặt trong/usr (ví dụ: biểu tượng, tệp .desktop, v.v.). Nếu bạn muốn bao gồm dữ liệu cùng với mô đun Python của bạn, bạn sử dụng 'package_data' cùng với cờ' include_package_data = True'. – Grumbel

13

UPD: package_data chấp nhận dict ở định dạng {'package': ['list', 'of?', 'globs*']}, vì vậy để thực hiện nó hoạt động, người ta nên chỉ định các quả cầu vỏ liên quan đến gói thư mục, không phải là đường dẫn tệp liên quan đến gốc phân phối.

data_files có ý nghĩa khác và nói chung, bạn nên tránh sử dụng thông số này.

Với setuptools bạn chỉ cần include_package_data=True, nhưng tập tin dữ liệu cần được theo hệ thống kiểm soát phiên bản, được biết đến setuptools (theo mặc định nó nhận ra chỉ CVS và SVN, cài đặt setuptools-git hoặc setuptools-hg nếu bạn sử dụng git hoặc hg ...)


với setuptools bạn có thể:

- trong MANIFEST.im:

include my_module/data* 

- trong setup.py:

setup(
     ... 
     include_package_data = True, 
     ... 
    ) 
+0

hm. đây là một chút ngắn. Bạn có thể giải thích về những hành động tương ứng gây ra không? Và tôi có phải làm cả hai thứ hay một trong hai thứ đó? –

+0

https://pythonhosted.org/setuptools/setuptools.html # including-data-files – podshumok

+0

Đây là phương pháp hoạt động độc lập với nền tảng. Khi tôi sử dụng câu trả lời được chấp nhận nó làm việc trên Mac OS, nhưng trên một máy ảo Linux các tập tin dữ liệu đã được sao chép vào những nơi xa lạ. –

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