ตัวเลือกที่ 1: ติดตั้งเป็นข้อมูลแพ็คเกจ
ข้อได้เปรียบหลักของการวางไฟล์ข้อมูลไว้ในรูทของแพ็คเกจ Python คือช่วยให้คุณไม่ต้องกังวลว่าไฟล์จะอยู่ที่ใดในระบบของผู้ใช้ซึ่งอาจเป็น Windows, Mac, Linux, แพลตฟอร์มมือถือบางตัวหรือภายใน Egg คุณสามารถค้นหาไดเร็กทอรีที่data
สัมพันธ์กับรูทแพ็กเกจ Python ของคุณได้เสมอไม่ว่าจะติดตั้งที่ใดหรืออย่างไร
ตัวอย่างเช่นถ้าฉันมีเค้าโครงโครงการดังนี้:
project/
foo/
__init__.py
data/
resource1/
foo.txt
คุณสามารถเพิ่มฟังก์ชันเพื่อ__init__.py
ค้นหาเส้นทางแบบสัมบูรณ์ไปยังไฟล์ข้อมูล:
import os
_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
return os.path.join(_ROOT, 'data', path)
print get_data('resource1/foo.txt')
ผลลัพธ์:
/Users/pat/project/foo/data/resource1/foo.txt
หลังจากติดตั้งโปรเจ็กต์เป็น Egg แล้วเส้นทางdata
จะเปลี่ยนไป แต่โค้ดไม่จำเป็นต้องเปลี่ยน:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
ตัวเลือกที่ 2: ติดตั้งในตำแหน่งที่แน่นอน
อีกทางเลือกหนึ่งคือวางข้อมูลของคุณไว้นอกแพ็คเกจ Python จากนั้น:
- มีตำแหน่งของการ
data
ส่งผ่านไฟล์การกำหนดค่าอาร์กิวเมนต์บรรทัดคำสั่งหรือ
- ฝังตำแหน่งลงในโค้ด Python ของคุณ
สิ่งนี้เป็นที่ต้องการน้อยกว่ามากหากคุณวางแผนที่จะแจกจ่ายโครงการของคุณ หากคุณต้องการทำสิ่งนี้จริงๆคุณสามารถติดตั้งได้data
ทุกที่ที่คุณต้องการบนระบบเป้าหมายโดยระบุปลายทางสำหรับแต่ละกลุ่มไฟล์โดยส่งผ่านรายการสิ่งที่เพิ่มเข้ามา:
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
อัปเดต : ตัวอย่างของฟังก์ชันเชลล์สำหรับไฟล์ grep Python แบบวนซ้ำ:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}