构建引用 .PYD 的 Python package/module 的正确方法是什么?

What is the proper way to construct a Python package/module referencing a .PYD?

我是 Python 世界的菜鸟,现在我发现自己正在尝试学习如何正确创建 Python 包或模块。我还有几个必须满足的要求。

我有一个从 C++ 编译的核心本机 DLL(我们将其命名为 MyCore.dll)。此 DLL 必须部署到特定安装位置,因为它是产品的核心组件(我们会说 ProgramFiles\MyProduct)。

我已经使用 SWIG 为 MyCore.dll 生成了 Python 绑定。它生成了 2 个文件:_MyCoreBindings.pyd(本质上是一个引用 MyCore.dll 的 DLL)和 MyCoreBindings.py(加载 _MyCoreBindings.pyd 并向其提供 Python API)。

最后,我有一个 Python 脚本 (MyProduct.py) 只包含一个导入,因为我的产品必须在 Python 中导入在名字 MyProduct.SDK 下:

import MyCoreBindings as SDK

因此,我希望用户的 Python 脚本能够像这样访问它:

import MyProduct.SDK

按依赖顺序排列的文件摘要:

我还读到 Python 包的格式涉及一些模仿导入路径的目录结构,并且可能包含 setup.py__init__.py,但我阅读的所有材料都没有明确说明每个文件中必须包含哪些内容,以及在什么情况下需要它们。我肯定不清楚这个目录结构可能放在哪里

如果您希望 Python 能够导入您的模块,那么您有两个选择:

  • 将模块安装到 Python 的 site-packages 文件夹。
  • 修改Python搜索modules/packages导入的路径。您可以通过 *.pth 文件或使用 Python 的 sys 模块修改路径(即 sys.path.append(/some/path) )

您使用 setup.py 安装包 and/or 创建 eggs/wheels 等。请参阅以下内容以获得有用的提示:

您可以在模块旁边的文件夹中使用 _init__.py 创建包:

- MyProduct
  - __init__.py
  - MyCoreBindings.py
  - _MyCoreBindings.pyd

_init__.py 文件可以为空。这基本上允许您将文件夹导入为 MyProduct:

import MyProduct

MyProduct.MyCoreBindings

from MyProduct import MyCoreBindings as SDK

如果您使用根文件夹中的 __init__.py,则不需要 MyProduct.py。我希望一切都有意义。