首页 > 解决方案 > 如何在 python wheel 中打包 perl 文件

问题描述

我们为一个包含 python 和 perl 脚本集合的包创建了一个 pip 轮文件。由于 python 打包只会将 python 文件添加到 wheel 文件中,因此打包 perl 文件的最佳方式也是如此。

这是我的项目结构

.
|____myproject
| |____logging.ini
| |____utils.py
| |____myperlscript.pl
| |____config.py
| |____version.py
| |____scripta.py
| |____scriptb.py
| |____scriptc.py
| |______init__.py
|____test
| |____test_scripts.py
|______init__.py
|____MANIFEST.in
|____README.md
|____setup.py
|____.gitignore
|____Jenkinsfile

标签: pythonperlsetuptoolsdistutilspython-wheel

解决方案


如果您当前正在setuptoolssetup.py您的项目使用,并使用python setup.py bdist_wheel用作生成.whl文件的方法,请将以下行添加到MANIFEST.in项目根目录中已经存在的文件中。

recursive-include myproject *

自然地,替换将包含目标脚本(或任何其他文件)myproject的实际顶级目录。.pl

作为一个演示,如果你setup.py的写法大致如下:

from setuptools import setup
from setuptools import find_packages

setup(
    name='myproject',
    version='0.0.0',
    description='demo package',
    long_description=open('README.md').read(),
    classifiers=[
        'Programming Language :: Python',
    ],
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
)

运行python setup.py bdist_wheel将显示如下所示的输出:

...
adding 'myproject/__init__.py'
adding 'myproject/config.py'
adding 'myproject/logging.ini'
adding 'myproject/myperlscript.pl'
adding 'myproject/scripta.py'
adding 'myproject/utils.py'
adding 'myproject/version.py'
adding 'test/__init__.py'
...

这些文件被打包在.whl

$ unzip -t dist/myproject-0.0.0-py3-none-any.whl 
Archive:  dist/myproject-0.0.0-py3-none-any.whl
    testing: myproject/__init__.py    OK
    testing: myproject/config.py      OK
    testing: myproject/logging.ini    OK
    testing: myproject/myperlscript.pl   OK
...

.whl在新环境中安装生成的文件:

$ pip install -U myproject-0.0.0-py3-none-any.whl 
Processing myproject-0.0.0-py3-none-any.whl
Installing collected packages: myproject
Successfully installed myproject-0.0.0
$ ls env/lib/python3.6/site-packages/myproject/
config.py    logging.ini      __pycache__  utils.py
__init__.py  myperlscript.pl  scripta.py   version.py

另请注意,如果MANIFEST.in不需要该方法,package_data={'': ['*']},则调用的包含参数setup也应使其适用于最新版本的setuptools.

进一步的附录:该setuptools包实际上有一个MANIFEST.in包含此特定语法的,但仅限于他们想要包含的文件的特定文件扩展名。尽管有一些指南/文档可能会提出其他建议,但这显然是一个受支持的选项。实际上,这是Python 默认附带的核心distutils模块提供的功能。相关问题:


推荐阅读