小能豆

Python打包:数据文件正确放入tar.gz文件中,但未安装到虚拟环境中

python

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

我发现它MANIFEST.in 负责将 Package_fiddler-0.0.0.tar.gz执行时生成的非 .py 文件放入其中python setup.py sdist

然后我做了:

(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

安装程序.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 的哪些配置(上面有代码库)?

配置1

添加:

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

配置2

添加:

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

配置3

添加:

include_package_data=True

配置4

添加:

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

删除:

packages=['package_fiddler',]

配置5(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注意:在我原来的帖子中,为了清楚起见,我使用了最简单的树结构,其中出现此问题,但实际上我的树看起来更像下面的树。对于那棵树,奇怪的是,如果我只以某种方式放入一个__init__.py,文件夹stylesheets中的所有数据文件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

阅读 86

收藏
2024-05-14

共1个答案

小能豆

看起来你遇到了一些问题,无法将非Python文件正确地安装到你的包中。让我们来解决这个问题。

首先,要将非Python文件包含在你的包中,你需要正确配置setup.py和MANIFEST.in文件。

在setup.py中,你需要使用package_data参数来指定要包含在安装包中的数据文件。在MANIFEST.in文件中,你需要使用recursive-include命令来指定要包含的非Python文件。

下面是正确的配置:

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'],
    package_data={'package_fiddler': ['data/*.html', 'data/stylesheets/*.css']},
)

MANIFEST.in:

include README.rst
recursive-include package_fiddler/data *.html
recursive-include package_fiddler/data/stylesheets *.css

这样配置后,执行python setup.py sdist将会生成一个包含你的Python代码以及指定的数据文件的tar.gz文件。

当你执行pip install dist/Package_fiddler-0.0.0.tar.gz时,数据文件应该会被正确地安装到你的虚拟环境中。

如果你有其他文件夹或文件需要包含,可以相应地调整package_data和MANIFEST.in文件中的模式。

至于你第二个树结构,其中在stylesheets文件夹中只放置一个__init__.py文件就可以正确安装所有数据文件,可能是因为setuptools会将具有__init__.py文件的文件夹视为包,并自动包含其中的所有文件。但是,依赖这种行为可能不是最可靠的解决方案,最好还是像上面那样明确地指定package_data

2024-05-14