Cách bao gồm các tệp tĩnh vào setuptools - Gói python


83

Tôi muốn bao gồm mã ./static/data.txtđến setuptools, đây là mã của tôi:

# setup.py
import os,glob
from setuptools import setup,find_packages

setup(
    name = "PotatoProject",
    version = "0.1.1",
    author = "Master Splinter",
    author_email = "splinter@initech.com",
    description = ("The potatoproject!"),
    url = 'http://www.google.com',
    license = "BSD",

    # adding packages
    packages=find_packages('src'),
    package_dir = {'':'src'},

    # trying to add files...
    include_package_data = True,
    package_data = {
        '': ['*.txt'],
        '': ['static/*.txt'],
        'static': ['*.txt'],
    },

    scripts=['src/startPotato'],
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Topic :: Utilities",
        "License :: OSI Approved :: BSD License",
    ],
)

Hệ thống tệp:

.
├── setup.py
└── src
    ├── distutils_setup.py
    ├── Potato
    │   ├── __init__.py
    │   ├── potatoData.txt
    │   └── printer.py
    ├── startPotato
    ├── static
    │   └── data.txt
    └── Tomato
        ├── big.py
        └── __init__.py

đầu ra khi chạy: python setup.py sdist

running sdist
running egg_info
creating src/PotatoProject.egg-info
writing src/PotatoProject.egg-info/PKG-INFO
writing top-level names to src/PotatoProject.egg-info/top_level.txt
writing dependency_links to src/PotatoProject.egg-info/dependency_links.txt
writing manifest file 'src/PotatoProject.egg-info/SOURCES.txt'
reading manifest file 'src/PotatoProject.egg-info/SOURCES.txt'
writing manifest file 'src/PotatoProject.egg-info/SOURCES.txt'
warning: sdist: standard file not found: should have one of README, README.txt

creating PotatoProject-0.1.1
creating PotatoProject-0.1.1/src
creating PotatoProject-0.1.1/src/Potato
creating PotatoProject-0.1.1/src/PotatoProject.egg-info
creating PotatoProject-0.1.1/src/Tomato
making hard links in PotatoProject-0.1.1...
hard linking setup.py -> PotatoProject-0.1.1
hard linking src/startPotato -> PotatoProject-0.1.1/src
hard linking src/Potato/__init__.py -> PotatoProject-0.1.1/src/Potato
hard linking src/Potato/printer.py -> PotatoProject-0.1.1/src/Potato
hard linking src/PotatoProject.egg-info/PKG-INFO -> PotatoProject-0.1.1/src/PotatoProject.egg-info
hard linking src/PotatoProject.egg-info/SOURCES.txt -> PotatoProject-0.1.1/src/PotatoProject.egg-info
hard linking src/PotatoProject.egg-info/dependency_links.txt -> PotatoProject-0.1.1/src/PotatoProject.egg-info
hard linking src/PotatoProject.egg-info/top_level.txt -> PotatoProject-0.1.1/src/PotatoProject.egg-info
hard linking src/Tomato/__init__.py -> PotatoProject-0.1.1/src/Tomato
hard linking src/Tomato/big.py -> PotatoProject-0.1.1/src/Tomato
Writing PotatoProject-0.1.1/setup.cfg
creating dist
Creating tar archive
removing 'PotatoProject-0.1.1' (and everything under it)

và không có txt nào được thêm vào! Không static/data.txtcũng không Potato/potatoData.txt...

Tôi đang thiếu gì ?!

Câu trả lời:


122

Như đã chỉ ra trong các nhận xét, có 2 cách để thêm tệp tĩnh:

1 - include_package_data = True + MANIFEST.in

Một MANIFEST.intệp trong cùng thư mục của tệp setup.pyđó trông giống như sau:

include src/static/*
include src/Potato/*.txt

Với include_package_data = Truetrong setup.py.

2 - package_data trong setup.py

package_data = {
    'static': ['*'],
    'Potato': ['*.txt']
}

Chỉ định các tệp bên trong setup.py.


Không sử dụng cả hai include_package_datapackage_datatrong setup.py.

include_package_datasẽ vô hiệu hóa package_datathông tin.

https://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files


3
Làm! Rõ ràng, MANIFEST.in chọn ra những tệp nào để bao gồm ngoài những gì setup.py / distutils đủ thông minh để đưa vào theo mặc định.
chbrown.

13
Làm điều này cộng với việc thêm include_package_data = Trueở trên đã làm việc với tôi. Cả hai đều phải được thực hiện: Tệp kê khai và chỉ thị setup.py.
djhaskin987

Tôi chỉ thêm "bao gồm * .txt". Hoạt động tuyệt vời thnx
Priyeshj

7
Cần lưu ý rằng bất cứ khi nào bạn chỉ định include_package_data=True, về cơ bản bạn sẽ vô hiệu hóa hiệu ứng của package_datavà đó là lý do tại sao setuptools mong đợi bạn đưa các tệp vào của bạn MANIFEST.in. Sử dụng một trong số chúng ( package_dataso với include_package_data=True+ MANIFEST.in), không phải cả hai.
konoufo

Có thể ghi vào thư mục tĩnh trong thời gian chạy không?
Hairy

28

Bao gồm tất cả các tệp một cách đệ quy:

recursive-include project_name/templates *
recursive-include project_name/static *

đâu project_namelà thư mục trên cùng dòng nơi bạn có setup.pytệp.


1
Bạn cũng có thể muốn bao gồm một tệp duy nhất có: include funniest/data.jsonví dụ
Rodrigo Dias

11

Theo tài liệu, có ba cách để bao gồm các tệp dữ liệu gói. Bạn có hai gói: Khoai tây và Cà chua. Thư mục tĩnh không nằm trong một trong hai gói đó, vì vậy đó là lý do tại sao từ điển package_data của bạn trong setup.py không hoạt động. Tùy chọn tệp kê khai yêu cầu include_package_data được đặt thành True trong setup.py. Truy cập các tệp dữ liệu không phải gói có thể được thực hiện theo cách tìm thấy ở đây .


6

Sử dụng sau

packages = ['.','templates','static','docs'],

package_data={'templates':['*'],'static':['*'],'docs':['*'],},

1
Điều này có thể quá bao gồm.
Acumenus

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.