您需要在您的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