您需要在您的setuptools发行版中明确包含不是Python源代码(*.py
)的任何资源。
有几种方法可以做到这一点。我推荐的一个是在你的setup()
函数中使用include_package_data = True
和MANIFEST.in
文件的组合。
因此,假设您的分布奠定了为my.package/my/package
(即没有中间src
或lib
目录),你可以使用这些方针的东西:
setup.py
from setuptools import setup, find_packages
setup(
...
packages = find_packages('my'), # include all packages under my/
include_package_data = True, # include everything in source control
# or included in MANIFEST.in
)
MANIFEST.in
recursive-include my *
recursive-include docs *
global-exclude *.pyc
global-exclude ._*
global-exclude *.mo
这将递归地包含my.package/my/
以下的任何类型的文件以及my.package/docs/
,并全局排除发布的发行版中不需要的某些其他类型的文件。
请参考Building and Distributing Packages with Setuptools » Including Data Files关于可用方法的详细信息,包括数据文件,The MANIFEST.in template关于如何定义MANIFEST
更多信息。
一旦您成功地将数据文件包含在您的发行版中,则应确保使用ResourceManager
API从您的代码中访问它们(而不是__file__
欺骗或其他路径攻击,这些攻击在某些平台上不起作用或压缩的鸡蛋)。
你是否在virtualenv之外安装/运行你的软件包?如果是的话,这可能不会奏效 - 路径问题。 – keda