อาจเป็นวิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้setuptools package_dataคำสั่ง นี่หมายถึงการใช้setuptools(หรือdistribute) แทนdistutilsแต่นี่เป็น "การอัพเกรด" ที่ราบรื่นมาก
นี่คือตัวอย่างเต็มรูปแบบ (แต่ยังไม่ทดลอง):
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=[],
)
สังเกตบรรทัดเฉพาะที่สำคัญตรงนี้:
package_data={'': ['license.txt']},
include_package_data=True,
package_dataเป็นdictชื่อแพ็คเกจ (ว่าง = แพ็คเกจทั้งหมด) ไปยังรายการรูปแบบ (สามารถรวม globs) ตัวอย่างเช่นหากคุณต้องการระบุเฉพาะไฟล์ภายในแพ็คเกจของคุณคุณสามารถทำได้เช่นกัน:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
วิธีแก้ปัญหาที่นี่คือไม่เปลี่ยนชื่อpyไฟล์ที่ไม่ใช่ของคุณด้วย.pyนามสกุล
ดูการนำเสนอของ Ian Bickingสำหรับข้อมูลเพิ่มเติม
อัปเดต: วิธีการ [ดีกว่า] อีกวิธีหนึ่ง
วิธีการอื่นที่ใช้งานได้ดีหากคุณต้องการควบคุมเนื้อหาของการแจกจ่ายซอร์ส ( sdist) และมีไฟล์นอกแพ็คเกจ (เช่นไดเรกทอรีระดับบนสุด) คือการเพิ่มMANIFEST.inไฟล์ ดูเอกสาร Pythonสำหรับรูปแบบของไฟล์นี้
ตั้งแต่เขียนคำตอบนี้ฉันพบว่าการใช้โดยMANIFEST.inทั่วไปแล้วเป็นวิธีที่น่าผิดหวังน้อยกว่าเพื่อให้แน่ใจว่าการกระจายแหล่งที่มาของคุณ (tar.gz ) มีไฟล์ที่คุณต้องการ
ตัวอย่างเช่นหากคุณต้องการรวมrequirements.txtจากระดับบนสุดให้รวมไดเรกทอรี "data" ระดับบนสุดซ้ำ:
include requirements.txt
recursive-include data *
อย่างไรก็ตามในการที่จะคัดลอกไฟล์เหล่านี้ในเวลาติดตั้งไปยังโฟลเดอร์ของแพ็คเกจภายในไซต์แพ็คเกจคุณจะต้องส่งinclude_package_data=Trueไปยังsetup()ฟังก์ชัน ดูการเพิ่มไฟล์ที่ไม่ใช่รหัสสำหรับข้อมูลเพิ่มเติม