python - 在 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”复制到“构建”中(不编译)。我也希望它作为分发的一部分打包在生成的轮子中。
任何想法?
解决方案
为了让它工作,我必须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”文件夹中的模块它们包含在轮子中,这是能够分发它们的重要点。
推荐阅读
- r - 如何使用R检查文件中单词列表的字符串
- android - 浏览器覆盖遮挡页面底部
- java - 如何突出显示 javafx Textarea 中的文本?
- python - 如何连续多次从列表中生成随机项目,但每次生成不同的项目
- node.js - Redis 按模式删除
- excel - 使用条件从excel中的字符串中提取数字
- node.js - Dropzone / React / NodeJS - 上传图像数组
- perl - CORE Perl 中的哪些内容将 ERRNO ($!) 设置为成功?
- c++ - 我在 CodeBlocks 上遇到了这个错误,但如果我修复它,它会触发一个错误,该错误是从修复第一个错误时触发的。我该如何解决?
- spring-boot - Feign 客户端 - 如何在运行时更改读取超时选项值?