อาจเป็นวิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้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()
ฟังก์ชัน ดูการเพิ่มไฟล์ที่ไม่ใช่รหัสสำหรับข้อมูลเพิ่มเติม