Có lẽ cách tốt nhất để làm điều này là sử dụng setuptools
package_data
chỉ thị. Điều này không có nghĩa là sử dụng setuptools
(hoặc distribute
) thay vì distutils
, nhưng đây là một "nâng cấp" rất liền mạch.
Đây là một ví dụ đầy đủ (nhưng chưa được kiểm tra):
from setuptools import setup, find_packages
setup(
name='your_project_name',
version='0.1',
description='A description.',
packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
package_data={'': ['license.txt']},
include_package_data=True,
install_requires=[],
)
Lưu ý các dòng cụ thể rất quan trọng ở đây:
package_data={'': ['license.txt']},
include_package_data=True,
package_data
là một dict
tên gói (trống = tất cả các gói) cho một danh sách các mẫu (có thể bao gồm các khối). Ví dụ: nếu bạn muốn chỉ định các tệp trong gói của mình, bạn cũng có thể làm điều đó:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
Giải pháp ở đây chắc chắn là không đổi tên các py
tệp không phải của bạn bằng một .py
phần mở rộng.
Xem phần trình bày của Ian Bicking để biết thêm.
CẬP NHẬT: Cách tiếp cận [Tốt hơn]
Một cách tiếp cận khác hoạt động tốt nếu bạn chỉ muốn kiểm soát nội dung của phân phối nguồn ( sdist
) và có các tệp bên ngoài gói (ví dụ: thư mục cấp cao nhất) là thêm MANIFEST.in
tệp. Xem tài liệu Python để định dạng của tệp này.
Kể từ khi viết phản hồi này, tôi đã thấy rằng việc sử dụng MANIFEST.in
thường là một cách tiếp cận ít gây khó chịu hơn để đảm bảo phân phối nguồn của bạn ( tar.gz
) có các tệp bạn cần.
Ví dụ: nếu bạn muốn bao gồm requirements.txt
từ cấp cao nhất, hãy bao gồm đệ quy thư mục "dữ liệu" cấp cao nhất:
include requirements.txt
recursive-include data *
Tuy nhiên, để các tệp này được sao chép khi cài đặt vào thư mục của gói bên trong các gói trang web, bạn sẽ cần cung cấp include_package_data=True
cho setup()
chức năng. Xem Thêm tệp không mã để biết thêm thông tin.