在setup.py中使用`package_data`包含没有__init__.py的非Python文件?

1 投票
1 回答
40 浏览
提问于 2025-04-12 03:01

给定这个目录结构(里面有一个空的 __init__.py 文件和一个 logging.yml 文件都可以):

foo
│   setup.py
│
└─── foo
     │   __init__.py
     │
     └─── config
              logging.yml

这是我尝试写的 setup.py 文件:

from os import path
from setuptools import find_packages, setup

package_name = "foo"


if __name__ == "__main__":
    setup(
        name=package_name,
        packages=find_packages(),
        package_dir={package_name: package_name},
        package_data={"config":[path.join(package_name, "config", "logging.yml")]},
        include_package_data=True,
    )

# Also tried:
# package_data={"config": [path.join("config", "logging.yml")]}
# package_data={"": [path.join("config", "logging.yml")]}
# package_data={"": [path.join(package_name, "config", "logging.yml")]}

在运行 python setup.py install 后没有出现错误(我也试过 python -m pip install .),但是在我的虚拟环境根目录下运行 fd -HIFuuueyml logging 没有返回任何结果,而且在 foo.egg-info\SOURCES.txt 中也找不到这个文件。

附注:我在本地测试时使用的是 3.13.0a5 版本;setuptools 版本是 69.2.0;pip 版本是 24.0。不过在我的持续集成测试和发布中,使用的是 2.7、3.5、3.6、3.7、3.8、3.9、3.10、3.11、3.12 版本,涵盖了 Windows、Linux 和 macOS 系统。

1 个回答

1

这个方法可以用:

from setuptools import find_packages, setup

package_name = "foo"


if __name__ == "__main__":
    setup(
        name=package_name,
        packages=find_packages(),
        package_data={"foo": ["config/logging.yml"]},
        include_package_data=True,
    )

你只有一个包叫做 foo,所以你的 package_data 只需要针对这个包来设置。

撰写回答