Python包装:数据文件适当地放入tar.gz文件中,但未安装到虚拟环境中



我无法将项目package_fiddler安装到我的虚拟环境中。

我已经弄清楚 MANIFEST.in负责将非 - .py文件放入执行python setup.py sdist时生成的 Package_fiddler-0.0.0.tar.gz 中。

然后我做到了:

(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz

但这没有安装数据文件,也没有将软件包安装到/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages

我尝试了设置参数package_datainclude_package_datadata_files的许多配置,但我似乎每次都使用了错误的配置。

package_data和/或include_package_data和/或data_files的哪种配置将正确安装package_fiddler

项目树

.
├── MANIFEST.in
├── package_fiddler
│   ├── data
│   │   ├── example.html
│   │   └── stylesheets
│   │       └── example.css
│   └── __init__.py
├── README.rst
└── setup.py

setup.py

from setuptools import setup

setup(
    name='Package_fiddler',
    entry_points={
    'console_scripts': ['package_fiddler = package_fiddler:main', ],},
    long_description=open('README.rst').read(),
    packages=['package_fiddler',])

清单

include README.rst
recursive-include package_fiddler/data *

我是否尝试过setup.py的哪些配置(带有代码库)?

configuration1

添加:

package_data={"": ['package_fiddler/data/*',]}

configuration2

添加:

package_data={"": ['*.html', '*.css', '*.rst']}

configuration3

添加:

include_package_data=True

configuration4

添加:

package_data={"": ['package_fiddler/data',]}

删除:

packages=['package_fiddler',]

configuration5 (Chris的建议)

添加:

package_data={"data": ['package_fiddler/data',]}

删除:

packages=['package_fiddler',]

配置6

添加:

package_data={"": ['package_fiddler/data/*',]}

删除:

packages=['package_fiddler',]

这些配置都不会在/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages上安装任何文件。

编辑

toshio kuratomi 的注释:在我的原始帖子中,我使用了最简单的树结构,在该结构中出现了这个问题,但实际上,我的树看起来更像下面的树。对于那棵树,奇怪的是,如果我只在stylesheets中放置了__init__.py,则可以正确安装texts文件夹中的所有数据文件!!!这让我感到困惑。

树2 (这以某种方式安装所有数据文件!!)

.
├── MANIFEST.in
├── package_fiddler
│   │── stylesheets
|   |     ├── __init__.py
|   |     ├── example.css  
|   |     └── other
|   |          └── example2.css
|   |__ texts
|   |     ├── example.txt  
|   |     └── other
|   |          └── example2.txt
│   └── __init__.py
├── README.rst
└── setup.py

找到了在这里对我有用的解决方案。

使用setuptools==2.0.2我做到了:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True,  # use MANIFEST.in during install
    ...
)

我个人不喜欢setuptools在概念和实现方面混合代码和数据的方式。我认为正是这种实现在这里绊倒了您。为了使setUptools查找和使用package_data所需的数据,才能驻留在Python软件包内。Python软件包可以是目录,但是目录中需要一个__init__.py文件。因此,看起来您需要以下(空是空)文件:

./package_fiddler/data/__init__.py
./package_fiddler/data/stylesheets/__init__.py

在" setup.py"中包含软件包数据的最简单方法就像:

package_data = {'<package name>': ['<path to data file within package dir>']}

所以在您的示例中:

package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}

package_data是词典,其中键是安装程序中包含的软件包的名称。这些键下的值应为包装目录中特定文件路径或环球/通配符的列表。

您还需要包括标志:

zip_safe=False

setup(...)中,如果您想能够解决数据的文件系统路径。否则,您可以使用pkg_resources来执行此操作:http://peak.telecommunity.com/devcenter/pythoneggs#accessing-package-resources

您绝对不需要"数据"目录中的__init__.py文件 - 此目录不是模块,也不是要导入。

使用

package_data={"data": ['package_fiddler/data',]}

而不是

packages=['package_fiddler',]

这对我有用。希望能帮助到你。

package_data={
    "package_fiddler": [
        '*.*',
        '*/*.*',
        '*/*/*.*',
    ],
},

最新更新