14个版本

0.2.10 2024年6月24日
0.2.9 2023年7月4日
0.2.7 2023年5月25日
0.2.6 2022年8月21日
0.2.0 2022年3月22日

构建工具中排名第47

Download history 13793/week @ 2024-05-02 14655/week @ 2024-05-09 12303/week @ 2024-05-16 13111/week @ 2024-05-23 14056/week @ 2024-05-30 13919/week @ 2024-06-06 14806/week @ 2024-06-13 13075/week @ 2024-06-20 15948/week @ 2024-06-27 12516/week @ 2024-07-04 13418/week @ 2024-07-11 15316/week @ 2024-07-18 19774/week @ 2024-07-25 21188/week @ 2024-08-01 20262/week @ 2024-08-08 16519/week @ 2024-08-15

每月下载量80,666
14个crate中使用(通过pyo3-build-config

MIT许可MIT

75KB
323

独立的python3(y).dll导入库生成器

Actions Status Crate Documentation

为MinGW-w64和MSVC(交叉)编译目标生成Python DLL的导入库(无论是python3.dll还是python3y.dll)。

此crate不需要在(交叉)编译宿主系统上存在Python 3分发文件。

此crate使用binutils dlltool程序为MinGW-w64目标生成Python DLL导入库。设置环境变量PYO3_MINGW_DLLTOOL将覆盖目标默认的dlltool命令名称。

注意:MSVC交叉编译目标需要宿主系统上提供LLVM binutils或Zig。更具体地说,当从Linux的目标*-pc-windows-msvc时,需要将可执行文件python3-dll-allvm-dlltool放入PATH中。

或者,可以将环境变量ZIG_COMMAND设置为例如"zig""python -m ziglang",然后使用zig dlltool代替llvm-dlltool(或MinGW binutils)。

PyO3集成

自版本 0.16.5 以来,pyo3 库通过其新的 generate-import-lib 功能实现了对稳定 ABI 和特定版本 Python DLL 导入库生成支持。

在此配置中,python3-dll-a 成为 pyo3 库的依赖项,并且在本地和交叉编译场景中由其构建脚本自动调用。

用于 abi3 PyO3 扩展模块的 Cargo.toml 例子

[dependencies]
pyo3 = { version = "0.16.5", features = ["extension-module", "abi3-py37", "generate-import-lib"] }

用于标准 PyO3 扩展模块的 Cargo.toml 例子

[dependencies]
pyo3 = { version = "0.16.5", features = ["extension-module", "generate-import-lib"] }

独立构建脚本的使用

如果使用较旧的 pyo3 库版本,或需要不同的 Python 绑定库,则可以直接在库构建脚本中使用 python3-dll-a

以下示例假设使用 PyO3 的旧版本。

用于 abi3 PyO3 扩展的 build.rs 脚本示例

以下 cargo 构建脚本可用于使用 MinGW-w64 或 MSVC 目标环境 ABI 对 Windows (64/32 位 x86 或 64 位 ARM) 的稳定 ABI PyO3 扩展模块进行交叉编译

fn main() {
    if std::env::var("CARGO_CFG_TARGET_OS").unwrap() == "windows" {
        let cross_lib_dir = std::env::var_os("PYO3_CROSS_LIB_DIR")
            .expect("PYO3_CROSS_LIB_DIR is not set when cross-compiling");
        let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
        let env = std::env::var("CARGO_CFG_TARGET_ENV").unwrap();

        let libdir = std::path::Path::new(&cross_lib_dir);
        python3_dll_a::generate_implib_for_target(libdir, &arch, &env)
            .expect("python3.dll import library generator failed");
    }
}

将自动在由环境变量 PYO3_CROSS_LIB_DIR 指向的目录中创建兼容的 python3.dll 导入库文件,命名为 python3.dll.apython3.lib

调用 cargo build 的示例

PYO3_CROSS_LIB_DIR=target/python3-dll cargo build --target x86_64-pc-windows-gnu

生成特定版本的 python3y.dll 导入库

作为一个高级特性,python3-dll-a 可以生成特定 Python 版本的导入库,例如 python39.lib

有关详细信息,请参阅 ImportLibraryGenerator 构建器 API 描述。

维护

该库基于 CPython 的 stable_abi.toml 文件嵌入 Module-Defitions。

该文件的上游版本位于 CPython 项目的 仓库 中,路径为 Misc/stable_abi.toml

依赖项