在 Python 包中包含 *.pyd 文件

Posted

技术标签:

【中文标题】在 Python 包中包含 *.pyd 文件【英文标题】:Include *.pyd files in Python Packages 【发布时间】:2016-08-30 02:40:33 【问题描述】:

我有一个 python 模块 module.pyd,一旦手动放入 python 安装文件夹的站点包中,它就可以正常工作。

当我将我的解决方案上传到云环境时,问题就开始了,buildpack 要求我将每个模块作为要与pip install module 一起安装的包传递。我用一个简单的 __init__.py 文件创建了一个文件夹,该文件只导入了 module.pyd 的所有内容,因此我的模块被视为一个文件夹。

然后我在这里阅读http://peterdowns.com/posts/first-time-with-pypi.html如何上传我自己的模块并且我成功了,但是当我安装我的模块时,module.pyd文件没有被复制。我也尝试通过存储库pip install git+repository 直接安装它,但同样的事情发生了。

我在这里读到https://docs.python.org/2/distutils/sourcedist.html#specifying-the-files-to-distribute 我可能不得不明确地说我想将 *.pyd 文件复制到 MANIFEST.in 文件中,我已经完成了,但它似乎还没有工作.

我目前使用 python 2.7.10

我是 python 新手,非常感谢你们的帮助

【问题讨论】:

不幸的是,这没有多大意义。为什么您不想分发实际的 .py 文件?如果它是您自己的代码,为什么需要将它放在站点包中,而不是放在您的项目本身中? @daniel-roseman 实际上我没有这个模块的 py 文件(我认为这是一个 C++ 编译)。我只想将它作为一个发行版或至少放在一个存储库中,以便云环境的 buildpack 可以访问它。但是一旦安装了模块,就会下载“init.py”文件,但不会下载 pyd 文件。我已经尝试将它与解决方案一起上传,但我不知道为什么,它不起作用 【参考方案1】:

只需使用MANIFEST.in

recursive-include module *.pyd

这将包括module 目录中的所有 pyd 文件。

您的包布局应如下所示:

module/
--- __init__.py
--- _module.pyd
--- module.py
MANIFEST.in
README.rst
setup.py

不要忘记在setup() 中添加include_package_data=Truesetup.py 中,以便在构建***和win32 安装程序时强制使用MANIFEST.in(否则MANIFEST.in 将仅用于源tarball/zip )。

setup() 的最小示例:

README_rst = ''
with open('README.rst', mode='r', encoding='utf-8') as fd:
    README_rst = fd.read()

setup(
    name='module',
    version='0.0.1',
    description='Cool short description',
    author='Author',
    author_email='author@mail.com',
    url='repo.com',
    packages=['module'],
    long_description=README_rst,
    include_package_data=True,
    classifiers=[
        # Trove classifiers
        # The full list is here: https://pypi.python.org/pypi?%3Aaction=list_classifiers
        'Development Status :: 3 - Alpha',
    ]
)

【讨论】:

您能否详细说明您使用module.py_module.pyd 的原因(为什么要添加.py 文件并使用下划线重命名.pyd 文件)? @florisla 啊抱歉,它可能确实令人困惑,_module.pyd 在这里是 SWIG 生成的 C++ 程序的 Python 模块接口,所以 _module.pydmodule.py 之间没有关系,它将 pyd 文件重命名为 _core.pyd 可能会更容易混淆。 那为什么要保留下划线呢?你想让 *.pyd 文件公开,对吧? 我们想提供一个带有文档字符串和默认命名关键字的更 Pythonic 的接口,所以 py 文件基本上只是重新定义了 pyd 的函数和类 :-) 此外,py 文件通过加载合适的 pyd,所以在我的具体情况下,我为各种平台生成了多个 pyd 文件。 @gaborous ...您将每个.pyd 文件发送到每个平台?为什么不只是 wheel 正确的 .pyd 到正确的平台?

以上是关于在 Python 包中包含 *.pyd 文件的主要内容,如果未能解决你的问题,请参考以下文章

python 安装whl文件

如何在python安装包中包含文本文件?

不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件

如何创建一个 SSIS 包,该包循环使用名称中包含特定关键字的 excel 文件?

Python程序加密打包

查看一个rpm包中包含那些文件/文件属于哪个rpm包