首页 > 解决方案 > 在 Setuptools 中使用 Cythonize 构建和交付 Python 模块

问题描述

在使用 Cython 和 cythonize 编译后,我正在构建一个 Python 包。

这是我的setup.py的示例:

from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize


setup(
    name="My_Pkg",
    version="0.0",
    ext_modules=cythonize('lib/my_pkg/my_mod.py'),
)

这是我的项目目录树的示例:

.
├── lib
│   └── my_pkg
│       ├── __init__.py
│       └── my_mod.py
└── setup.py

执行 setuptools 时,一切正常:

MACOSX_DEPLOYMENT_TARGET=10.15.1 python setup.py build_ext bdist_wheel

我的模块已正确转换为“.c”并在“build”目录中编译为“.so”。当一切都完成后,轮子在'dist'中创建:

.
├── My_Pkg.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── build
│   ├── bdist.macosx-10.7-x86_64
│   ├── lib.macosx-10.7-x86_64-3.7
│   │   └── my_pkg
│   │       └── my_mod.cpython-37m-darwin.so
│   └── temp.macosx-10.7-x86_64-3.7
│       └── lib
│           └── my_pkg
│               └── my_mod.o
├── dist
│   └── My_Pkg-0.0-cp37-cp37m-macosx_10_7_x86_64.whl
├── lib
│   └── my_pkg
│       ├── __init__.py
│       ├── my_mod.c
│       └── my_mod.py
└── setup.py

我的问题是我希望在 setuptools 构建阶段也将“__init__.py”复制到“构建”中(不编译)。我也希望它作为分发的一部分打包在生成的轮子中。

任何想法?

标签: pythoncythonsetuptoolscythonize

解决方案


为了让它工作,我必须setup在 in 中添加两个关键字参数setup.py

packages=["my_pkg"],
package_dir={'': 'lib'},do two things:

(你也可以使用find_packages。这就是你告诉 setuptools 它应该安装的 Python 包的方式。具体来说,我们告诉它我们有一个名为“my_pkg”的包,它应该寻找lib它们。阅读关于这个的最佳位置是 distutils 文档(setuptools 建立在 distutils 之上,但主要记录更改)。

请注意,这不包括“build”文件夹中的 .py 文件。这纯粹是一个临时工作空间,因此毫无意义地向其中复制文件是没有意义的。您不应该尝试导入隐藏在“build”文件夹中的模块它们包含在轮子中,这是能够分发它们的重要点。


推荐阅读