在 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=True
在setup.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.pyd
和 module.py
之间没有关系,它将 pyd 文件重命名为 _core.pyd
可能会更容易混淆。
那为什么要保留下划线呢?你想让 *.pyd 文件公开,对吧?
我们想提供一个带有文档字符串和默认命名关键字的更 Pythonic 的接口,所以 py 文件基本上只是重新定义了 pyd 的函数和类 :-) 此外,py 文件通过加载合适的 pyd,所以在我的具体情况下,我为各种平台生成了多个 pyd 文件。
@gaborous ...您将每个.pyd
文件发送到每个平台?为什么不只是 wheel
正确的 .pyd
到正确的平台?以上是关于在 Python 包中包含 *.pyd 文件的主要内容,如果未能解决你的问题,请参考以下文章
不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件