จะรวมข้อมูลแพ็คเกจกับ setuptools / distutils ได้อย่างไร?


145

เมื่อใช้ setuptools ฉันไม่สามารถให้ตัวติดตั้งดึงpackage_dataไฟล์ใด ๆ ทุกสิ่งที่ฉันอ่านบอกว่าต่อไปนี้เป็นวิธีที่ถูกต้องในการทำ ใครช่วยแนะนำได้ไหม

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   zip_safe=False,
   install_requires=['distribute'],
)

ที่myapp/data/เป็นที่ตั้งของไฟล์ข้อมูล


3
ฉันกำลังประสบปัญหาเดียวกัน ... การระบุdata_filesแก้ไขปัญหาด้วยตนเองแล้ว แต่นี่เป็นข้อผิดพลาดได้ง่ายและไม่ "เหมาะสม" สำหรับฉัน มีใครสามารถตรวจสอบได้ว่าจำเป็นต้องทำซ้ำการกำหนดค่าทั้งในpackage_dataและdata_filesหรือไม่
exhuma

github.com/wimglenn/resources-example แสดงให้เห็นถึงโครงสร้างโครงการ setuptools ที่ทันสมัยซึ่งได้อย่างถูกต้องสามารถแพคเกจไฟล์ข้อมูลลงในล้อและ sdists pyproject.tomlใช้ ไม่setup.pyต้องใช้ไฟล์
Wim

คำตอบ:


303

ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับคนที่หาทางมาที่นี่ผ่าน Google: package_dataเป็นคำโกหกที่ไร้สาระ ใช้เฉพาะเมื่อสร้างแพ็คเกจไบนารี ( python setup.py bdist ...) แต่ไม่ใช่เมื่อสร้างแพ็คเกจต้นทาง ( python setup.py sdist ...) แน่นอนว่านี่เป็นเรื่องไร้สาระ - ใคร ๆ ก็คาดหวังว่าการสร้างการแจกจ่ายซอร์สจะส่งผลให้มีการรวบรวมไฟล์ที่สามารถส่งไปให้คนอื่นเพื่อสร้างการกระจายไบนารี

ไม่ว่าในกรณีใดการใช้MANIFEST.inจะใช้ได้ทั้งกับไบนารีและการแจกแจงต้นทาง


103
ฉันได้ศึกษาปัญหานี้ในช่วงชั่วโมงที่ผ่านมาและได้ลองใช้หลายวิธี ในขณะที่คุณพูดว่าpackage_dataทำงานให้และไม่ได้bdist อย่างไรก็ตาม , ทำงานให้แต่ไม่ได้สำหรับ! ดังนั้นดีที่สุดที่ฉันได้รับสามารถที่จะเกิดขึ้นกับคือการรวมทั้งสองและเพื่อรองรับทั้งสองและ sdistMANIFEST.insdistbdistpackage_dataMANIFEST.inbdistsdist
Wesley Baugh

7
ฉันพบสิ่งอื่นเพื่อสนับสนุน @WesleyBaugh ในstackoverflow.com/a/2969087/261718ใช้MANIFEST.inสำหรับไฟล์ที่คุณจะไม่ติดตั้งเช่นเอกสารประกอบและpackage_dataสำหรับไฟล์ที่คุณใช้ที่ไม่ใช่รหัส Python (เช่นรูปภาพหรือเทมเพลต)
Drake Guan

13
ฉันใช้ sdist และต้องรวมทั้งMANIFEST.in และ package_data . ดูเหมือนว่าMANIFEST.inจะควบคุมสิ่งที่รวมอยู่ในการแจกจ่ายและ package_data จะควบคุมสิ่งที่จะถูกคัดลอกไปยัง dir site_packages ในระหว่างการติดตั้ง เส้นทางในMANIFEST.inนั้นสัมพันธ์กับตำแหน่งของ setup.py และpackage_dataสัมพันธ์กับแต่ละแพ็กเกจ (เช่นโมดูล) รูท
Edward Newell

10
"เปลี่ยนแปลงในเวอร์ชัน 2.7: ไฟล์ทั้งหมดที่ตรงกับ package_data จะถูกเพิ่มลงในไฟล์ MANIFEST หากไม่มีเทมเพลตโปรดดูการระบุไฟล์ที่จะแจกจ่าย" จาก distutils ดังนั้นคุณจะเห็นพฤติกรรมของไฟล์package_dataที่รวมอยู่ใน ZIP โดยอัตโนมัติหากคุณไม่มีไฟล์ MANIFEST.in ที่มีอยู่และเฉพาะเมื่อคุณใช้ 2.7+
Johnus

39
อย่างจริงจังฉันรู้สึกว่าตั๋วนี้เป็นเซสชั่นบำบัดกลุ่มสำหรับคนที่ใช้ setuptools และค้นพบว่าเป็นสถานที่ที่น่ากลัวที่พวกเขาพบในชีวิต
Matt Joyce

33

ฉันเพิ่งมีปัญหาเดียวกันนี้ include_package_data=Trueการแก้ปัญหาเป็นเพียงที่จะลบ

หลังจากอ่านที่นี่ฉันตระหนักว่าinclude_package_dataมีจุดมุ่งหมายเพื่อรวมไฟล์จากการควบคุมเวอร์ชันซึ่งตรงข้ามกับ "รวมข้อมูลแพ็กเกจ" ตามชื่อเท่านั้น จากเอกสาร:

ไฟล์ข้อมูล [ของ include_package_data] ต้องอยู่ภายใต้การควบคุม CVS หรือการโค่นล้ม

...

หากคุณต้องการการควบคุมที่ละเอียดยิ่งขึ้นสำหรับไฟล์ที่รวมอยู่ (ตัวอย่างเช่นหากคุณมีไฟล์เอกสารในไดเร็กทอรีแพ็กเกจของคุณและต้องการแยกออกจากการติดตั้ง) คุณสามารถใช้package_dataคีย์เวิร์ดได้เช่นกัน

การแก้ไขข้อโต้แย้งนั้นโดยบังเอิญซึ่งบังเอิญว่าทำไมมันถึงได้ผลเช่นกันเมื่อคุณเปลี่ยนไปใช้ความแตกต่างเนื่องจากไม่ได้ใช้อาร์กิวเมนต์นั้น


2
ประสบการณ์ของฉันแตกต่างกันฉันมีปัญหาเดียวกันโดยไม่รวมinclude_package_data=Trueรายการ ทางออกเดียวสำหรับฉันคือเพิ่มรายการใน Manifest ตามที่แนะนำข้างต้น โปรดทราบว่าฉันใช้ setuptools เวอร์ชันของคุณอาจใช้งานได้กับ "แจกจ่าย" หรือไม่
TimStaley

4
เหตุผลที่แท้จริงว่าทำไมการลบการinclude_package_dataแก้ปัญหานั้นมีอยู่เพิ่มเติมในข้อความต้นฉบับ - หากใช้include_package_dataอาร์กิวเมนต์เฉพาะ setuptools ไฟล์ที่ระบุโดยpackage_dataจะไม่ถูกเพิ่มลงในไฟล์ Manifest โดยอัตโนมัติเว้นแต่จะแสดงอยู่ในMANIFEST.inไฟล์
Piotr Dobrogost

อะไรคือกรณีการใช้งานของการpackage_dataตั้งค่าเป็นรายการที่ไม่ว่างเปล่าและระบุinclude_package_data=False? แล้วทำไมคุณต้องระบุไฟล์สองครั้งในMANIFEST.inและpackage_data?
Herbert

21

การทำตามคำแนะนำของ @Joe ในการลบinclude_package_data=Trueไลน์ก็ใช้ได้ผลกับฉันเช่นกัน

เพื่ออธิบายเพิ่มเติมอีกเล็กน้อยฉันไม่มี MANIFEST.inไฟล์ ฉันใช้ Git ไม่ใช่ CVS

Repository มีรูปร่างลักษณะนี้:

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

ฉันเรียกใช้python setup.py sdistการกระจายแหล่งที่มา (ยังไม่ได้ลองไบนารี)

และเมื่ออยู่ในสภาพแวดล้อมเสมือนใหม่ล่าสุดฉันมีmyproject-4.19.tar.gzไฟล์และฉันใช้

(venv) pip install ~/myproject-4.19.tar.gz
...

และอื่น ๆ กว่าทุกอย่างที่ได้รับการติดตั้งไปยังสภาพแวดล้อมเสมือนจริงของฉันsite-packagesผู้ไฟล์ข้อมูลพิเศษได้รับการติดตั้งให้และ/opt/local/myproject/data/opt/local/myproject/etc


17

include_package_data=True ทำงานให้ฉัน

ถ้าคุณใช้คอมไพล์อย่าลืมที่จะรวมในsetuptools-git install_requiresน่าเบื่อน้อยกว่าการมีManifestหรือรวมเส้นทางทั้งหมดไว้ในpackage_data(ในกรณีของฉันเป็นแอป django ที่มีสถิตยศาสตร์ทุกประเภท)

(วางความคิดเห็นที่ฉันทำตามที่k3-rncกล่าวว่ามันมีประโยชน์จริงตามที่เป็นอยู่)


7

อัปเดต : คำตอบนี้เก่าและข้อมูลไม่ถูกต้องอีกต่อไป ควรใช้การimport setuptoolsกำหนดค่าsetup.py ทั้งหมด ฉันได้เพิ่มคำตอบที่สมบูรณ์มากขึ้นที่https://stackoverflow.com/a/49501350/64313


ฉันแก้ปัญหานี้ได้โดยเปลี่ยนไปใช้สิ่งรบกวน ดูเหมือนว่าการแจกจ่ายจะเลิกใช้งานและ / หรือใช้งานไม่ได้

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)

2
การแจกจ่ายไม่ได้เลิกใช้งาน แต่กำลังแทนที่สิ่งที่ผิดปกติ ฉันไม่รู้ว่าทำไมคุณถึงประสบปัญหา แต่นั่นไม่ใช่เหตุผล
agf

1
นั่นคือคำตอบที่ฉันได้รับจาก IRC ฉันจะเชื่อใครดี? หากคุณมีตัวอย่างการทำงานโดยใช้การแจกจ่ายฉันจะขอบคุณแล้ว
cmcginty

6
คำชี้แจง: การแจกจ่ายมีไว้เพื่อแทนที่ setuptools ทั้งสองอย่างถูกสร้างขึ้นที่ด้านบนของ distutils ในที่สุด distutils เองจะถูกแทนที่ด้วยแพ็คเกจใหม่ที่เรียกว่า "distutils2" ใน python2 และ "packaging" ใน python3
Kevin Horn

1
การเปลี่ยนไปใช้สิ่งที่include_package_data=Trueไม่ถูกต้องช่วยแก้ปัญหาของฉันในกรณีที่ไม่ได้รับเกียรติ ด้วยการตั้งค่าดังกล่าวคุณต้องใช้ MANIFEST.in เท่านั้น - ไม่จำเป็นต้องทำซ้ำรายการไฟล์ของคุณในการpackage_dataตั้งค่า
Daniel Sokolowski

4

คำถามโบราณ แต่ ... การจัดการแพคเกจของ python ทำให้เป็นที่ต้องการมาก ดังนั้นฉันจึงมีกรณีการใช้งานในการติดตั้งโดยใช้ pip ในเครื่องไปยังไดเร็กทอรีที่ระบุและรู้สึกแปลกใจทั้งเส้นทาง package_data และ data_files ไม่ได้ผล ฉันไม่กระตือรือร้นที่จะเพิ่มไฟล์อื่นใน repo ดังนั้นฉันจึงใช้ประโยชน์จากตัวเลือก data_files และ setup.py --install-data; อะไรทำนองนี้

pip install . --install-option="--install-data=$PWD/package" -t package  

4

ฉันมีปัญหาเดียวกันมาสองสามวันแล้ว แต่ถึงแม้เธรดนี้จะไม่สามารถช่วยฉันได้เพราะทุกอย่างสับสน ดังนั้นฉันจึงทำการวิจัยและพบวิธีแก้ปัญหาต่อไปนี้:

โดยทั่วไปในกรณีนี้คุณควรทำ:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

คำตอบ stackoverflow อื่น ๆ ที่นี่


พยายามแล้ว แต่ก็ยังไม่มีการคัดลอก
gerrit


3

เพียงแค่ลบบรรทัด:

include_package_data=True,

จากสคริปต์การตั้งค่าของคุณและมันจะทำงานได้ดี (ทดสอบแล้วตอนนี้ด้วย setuptools ล่าสุด)


มันบ้ามาก แต่มันใช้ได้ทั้งกับsdistและbdist_wheelคุณได้ตรวจสอบว่าทำไม?
Szabolcs

1
ฉันสามารถยืนยันได้ว่าsdistจะเพิกเฉยpackage_dataเมื่อมีการตั้งค่านี้
Sander Steffann

ถึงตอนนี้เป็นเวลาหลายเดือนแล้ว แต่ดูเหมือนว่าฉันจะจำได้ว่ากำลังขุดโค้ดหายไปสองครั้งใช้หวีซี่ละเอียดมากไปที่เอกสารและได้รับความพึงพอใจ เห็นได้ชัดว่าสคริปต์ตัวอย่างต่างๆมีแฟล็กนี้และทำให้ปวดหัวไม่สิ้นสุด
เอียน

2

ใช้ setup.cfg (setuptools ≥ 30.3.0)

เริ่มต้นด้วย setuptools 30.3.0 (เผยแพร่ 2016-12-08) คุณสามารถเก็บsetup.pyขนาดเล็กมากและย้ายการกำหนดค่าไปยังsetup.cfgไฟล์ ด้วยวิธีนี้คุณสามารถใส่ข้อมูลแพ็คเกจของคุณใน[options.package_data]ส่วน:

[options.package_data]
* = *.txt, *.rst
hello = *.msg

ในกรณีนี้คุณsetup.pyสามารถสั้นได้ดังนี้:

from setuptools import setup
setup()

สำหรับข้อมูลเพิ่มเติมโปรดดูที่การกำหนดค่าการติดตั้งการใช้ไฟล์ setup.cfg

มีการพูดคุยของเลิกบางอย่างsetup.cfgในความโปรดปรานของpyproject.tomlตามที่เสนอในPEP 518แต่นี้ยังคงเป็นของชั่วคราว 2020/02/21


คำตอบนี้ละเลยที่จะพูดถึงไฟล์ MANIFEST ดังนั้นฉันคิดว่ามันจะไม่ทำงานกับ sdists มีล้อเท่านั้น คุณควรพูดถึงเรื่องนั้น
Wim

@wim ฉันมีความเข้าใจไม่เพียงพอเกี่ยวกับ MANIFEST, sdist และ Wheels ที่จะตอบคำถามนั้น สิ่งนี้ใช้ได้ผลสำหรับฉันโดยใช้pip install.
gerrit

นั่นเป็นเพราะpip installสำหรับ pip รุ่นที่ทันสมัยพอจะสร้างล้อก่อนแล้วจึงติดตั้ง สำหรับผู้ใช้หลายคนวิธีนี้จะไม่สามารถรวมข้อมูลแพ็คเกจได้ ดูคำตอบที่ยอมรับและความคิดเห็นด้านล่างสำหรับรายละเอียดเกี่ยวกับเรื่องนั้น การใช้ a setup.cfgเป็นเพียงวิธีอื่นในการเขียนสิ่งที่ OP ทำอยู่แล้วในsetup.pyคำถาม (โดยการส่งผ่านpackage_dataอาร์กิวเมนต์คำหลักในการเรียกไปที่setup) ดังนั้นฉันไม่คิดว่านี่จะเป็นประโยชน์อย่างยิ่งสำหรับคำตอบสำหรับคำถามนี้ มันไม่ได้ช่วยแก้ปัญหาพื้นฐานเลย
Wim

1

ฉันพบโพสต์นี้ในขณะที่ติดปัญหาเดียวกัน

ประสบการณ์ของฉันขัดแย้งกับประสบการณ์ในคำตอบอื่น ๆ include_package_data=True รวมข้อมูลใน bdist! คำอธิบายในsetuptools เอกสารประกอบ ขาดบริบทและเคล็ดลับในการแก้ปัญหา แต่ include_package_dataทำงานได้ตามที่โฆษณา

การตั้งค่าของฉัน:

  • Windows / Cygwin
  • git เวอร์ชัน 2.21.0
  • การแจกจ่าย Python 3.8.1 ของ Windows
  • setuptools v47.3.1
  • check-manifest v0.42

นี่คือคำแนะนำวิธีการของฉัน

วิธีรวมข้อมูลแพ็คเกจ

นี่คือโครงสร้างไฟล์สำหรับโครงการที่ฉันเผยแพร่บน PyPI (ติดตั้งแอปพลิเคชันใน__main__.py)

├── LICENSE.md
├── MANIFEST.in
├── my_package
│   ├── __init__.py
│   ├── __main__.py
│   └── _my_data          <---- folder with data
│       ├── consola.ttf   <---- data file
│       └── icon.png      <---- data file
├── README.md
└── setup.py

จุดเริ่ม

นี่คือจุดเริ่มต้นทั่วไปสำหรับsetuptools.setup()ใน setup.py.

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    ...
)

setuptools.find_packages()รวมแพ็คเกจทั้งหมดของฉันในการแจกจ่าย แพ็คเกจเดียวของฉันคือmy_package.

โฟลเดอร์ย่อยที่มีข้อมูลของฉัน_my_dataไม่ถือว่าเป็นแพคเกจโดย Python เนื่องจากไม่มีโฟลเดอร์__init__.pyจึงfind_packages()ไม่พบ

วิธีแก้ปัญหาที่มักอ้างถึง แต่ไม่ถูกต้องคือการใส่__init__.pyไฟล์เปล่าลง ใน_my_dataโฟลเดอร์

นี้จะทำให้มันเป็นแพคเกจดังนั้นจึงไม่รวมถึงโฟลเดอร์ _my_dataในการจัดจำหน่าย แต่ไฟล์ข้อมูลที่อยู่ภายใน _my_dataจะไม่รวม

ดังนั้นการ_my_dataทำเป็นแพ็คเกจไม่ได้ช่วยอะไร

วิธีแก้ปัญหาคือ:

  • sdistมีอยู่แล้วไฟล์ข้อมูล
  • เพิ่มinclude_package_data=Trueเพื่อรวมไฟล์ข้อมูลไว้ในไฟล์bdistด้วย

การทดลอง (วิธีทดสอบวิธีแก้ปัญหา)

มีสามขั้นตอนในการทำการทดสอบที่ทำซ้ำได้:

$ rm -fr build/ dist/ my_package.egg-info/
$ check-manifest
$ python setup.py sdist bdist_wheel

ฉันจะแยกสิ่งเหล่านี้ลงทีละขั้นตอน:

  1. ทำความสะอาดโครงสร้างเก่า:
$ rm -fr build/ dist/ my_package.egg-info/
  1. เรียกใช้check-manifestเพื่อให้แน่ใจว่าMANIFEST.in ตรงกับดัชนี Git ของไฟล์ภายใต้การควบคุมเวอร์ชัน:
$ check-manifest

หากMANIFEST.inยังไม่มีให้สร้างจากดัชนี Git ของไฟล์ภายใต้การควบคุมเวอร์ชัน:

$ check-manifest --create

นี่คือสิ่งMANIFEST.inที่สร้างขึ้น:

include *.md
recursive-include my_package *.png
recursive-include my_package *.ttf

ไม่มีเหตุผลที่จะแก้ไขไฟล์นี้ด้วยตนเอง

ตราบใดที่ทุกสิ่งที่ควรอยู่ภายใต้การควบคุมเวอร์ชันอยู่ภายใต้การควบคุมเวอร์ชัน (กล่าวคือเป็นส่วนหนึ่งของดัชนี Git) check-manifest --createทำในสิ่งที่ถูกต้อง

หมายเหตุ: ไฟล์ไม่ได้เป็นส่วนหนึ่งของดัชนี Git หากเป็น:

  • ละเว้นในไฟล์ .gitignore
  • ไม่รวมอยู่ใน .git/info/exclude
  • หรือไฟล์ใหม่ที่ยังไม่ได้เพิ่มลงในดัชนี

และหากไฟล์ใด ๆ อยู่ภายใต้การควบคุมเวอร์ชันที่ไม่ควรอยู่ภายใต้การควบคุมเวอร์ชันให้check-manifestออกคำเตือนและระบุไฟล์ที่แนะนำให้ลบออกจากดัชนี Git

  1. สร้าง:
$ python setup.py sdist bdist_wheel

ตอนนี้ตรวจสอบsdist(การแจกจ่ายต้นทาง) และbdist_wheel (สร้างการแจกจ่าย) เพื่อดูว่ามีไฟล์ข้อมูลหรือไม่

ดูเนื้อหาของsdist(แสดงเฉพาะบรรทัดที่เกี่ยวข้องด้านล่าง):

$ tar --list -f dist/my_package-0.0.1a6.tar.gz
my_package-0.0.1a6/
...
my_package-0.0.1a6/my_package/__init__.py
my_package-0.0.1a6/my_package/__main__.py
my_package-0.0.1a6/my_package/_my_data/
my_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!
my_package-0.0.1a6/my_package/_my_data/icon.png    <-- yay!
...

ดังนั้นsdistไฟล์ข้อมูลจึงรวมอยู่แล้วเนื่องจากมีรายชื่ออยู่ในMANIFEST.in. ไม่มีอะไรเพิ่มเติมที่ต้องทำเพื่อรวมไฟล์ข้อมูลในไฟล์sdist.

ดูเนื้อหาของbdist(เป็นไฟล์. zip แยกวิเคราะห์ด้วยzipfile.ZipFile):

$ python check-whl.py
my_package/__init__.py
my_package/__main__.py
my_package-0.0.1a6.dist-info/LICENSE.md
my_package-0.0.1a6.dist-info/METADATA
my_package-0.0.1a6.dist-info/WHEEL
my_package-0.0.1a6.dist-info/entry_points.txt
my_package-0.0.1a6.dist-info/top_level.txt
my_package-0.0.1a6.dist-info/RECORD

หมายเหตุ: คุณต้องสร้างcheck-whl.pyสคริปต์ของคุณเองเพื่อสร้างผลลัพธ์ข้างต้น มันเป็นเพียงสามบรรทัด:

from zipfile import ZipFile
path = "dist/my_package-0.0.1a6-py3-none-any.whl" # <-- CHANGE
print('\n'.join(ZipFile(path).namelist()))

ตามที่คาดไว้bdistไฟล์ข้อมูลหายไป

_my_dataโฟลเดอร์จะสมบูรณ์หายไป

จะเกิดอะไรขึ้นถ้าฉันสร้าง_my_data/__init__.py? ฉันทำการทดลองซ้ำและพบว่ายังไม่มีไฟล์ข้อมูลอยู่! รวม _my_data/โฟลเดอร์ไว้แต่ไม่มีไฟล์ข้อมูล!

วิธีการแก้

ขัดกับประสบการณ์ของผู้อื่นนี้ไม่ทำงาน:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True, # <-- adds data files to bdist
    ...
)

เมื่อแก้ไขแล้วให้ทำการทดสอบซ้ำ:

$ rm -fr build/ dist/ my_package.egg-info/
$ check-manifest
$ python.exe setup.py sdist bdist_wheel

ตรวจสอบให้แน่ใจว่าsdistยังมีไฟล์ข้อมูลอยู่:

$ tar --list -f dist/my_package-0.0.1a6.tar.gz
my_package-0.0.1a6/
...
my_package-0.0.1a6/my_package/__init__.py
my_package-0.0.1a6/my_package/__main__.py
my_package-0.0.1a6/my_package/_my_data/
my_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!
my_package-0.0.1a6/my_package/_my_data/icon.png    <-- yay!
...

ดูเนื้อหาของbdist:

$ python check-whl.py
my_package/__init__.py
my_package/__main__.py
my_package/_my_data/consola.ttf        <--- yay!
my_package/_my_data/icon.png           <--- yay!
my_package-0.0.1a6.dist-info/LICENSE.md
my_package-0.0.1a6.dist-info/METADATA
my_package-0.0.1a6.dist-info/WHEEL
my_package-0.0.1a6.dist-info/entry_points.txt
my_package-0.0.1a6.dist-info/top_level.txt
my_package-0.0.1a6.dist-info/RECORD

วิธีไม่ทดสอบว่ามีไฟล์ข้อมูลหรือไม่

ผมขอแนะนำให้แก้ไขปัญหา / การทดสอบโดยใช้วิธีการที่ระบุไว้ข้างต้นในการตรวจสอบและsdistbdist

การติดตั้ง pip ในโหมดที่แก้ไขได้ไม่ใช่การทดสอบที่ถูกต้อง

หมายเหตุ: pip install -e . ไม่แสดงว่าไฟล์ข้อมูลรวมอยู่ในไฟล์bdist.

ลิงก์สัญลักษณ์ทำให้การติดตั้งทำงานเหมือนกับว่ามีการรวมไฟล์ข้อมูลไว้ (เนื่องจากมีอยู่แล้วในคอมพิวเตอร์ของผู้พัฒนา)

หลังจากนั้นpip install my_packageไฟล์ข้อมูลจะอยู่ในlib/site-packages/my_package/โฟลเดอร์ของสภาพแวดล้อมเสมือนโดยใช้โครงสร้างไฟล์เดียวกันกับที่แสดงด้านบนในรายการwhlเนื้อหา

การเผยแพร่ไปยัง TestPyPI เป็นวิธีทดสอบที่ช้า

การเผยแพร่ไปยัง TestPyPI จากนั้นติดตั้งและค้นหา lib/site-packages/my_packagesเป็นการทดสอบที่ถูกต้อง แต่ใช้เวลานานเกินไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.