求助:如何在Python项目中实现与Swift的混合编程?

我想用 swift 写一个 GUI, 然后内部一些逻辑用 python, 但是一直没有找到这两个混编的方案
求助:如何在Python项目中实现与Swift的混合编程?

4 回复
  • 开个 python 的本地 web server
    * 跨进程 IPC
    * swift -> c -> python

    我也没试过, 只是能想到的方案

核心方案:使用 C 语言作为桥梁,通过 Python 的 ctypescffi 调用 Swift 编译的动态库。

Swift 可以通过 @_cdecl 或创建 C 兼容头文件来暴露 C 接口。Python 调用这些接口即可实现混合编程。以下是具体步骤和完整示例:

1. Swift 侧:创建 C 兼容的动态库

// SwiftLib.swift
import Foundation

// 使用 @_cdecl 导出 C 函数(适用于简单场景,注意这是 Swift 私有特性)
@_cdecl("add_numbers")
public func addNumbers(a: Int32, b: Int32) -> Int32 {
    return a + b
}

// 更稳定的方式:通过桥接头文件定义 C 函数
// 在 Bridging-Header.h 中添加:
//   int32_t multiply_numbers(int32_t a, int32_t b);
@_cdecl("multiply_numbers")
public func multiplyNumbers(a: Int32, b: Int32) -> Int32 {
    return a * b
}

编译命令(生成 libSwiftLib.dylib):

swiftc -emit-library -Xlinker -install_name -Xlinker @rpath/libSwiftLib.dylib SwiftLib.swift -o libSwiftLib.dylib

2. Python 侧:使用 ctypes 调用动态库

# python_client.py
import ctypes
import os

# 加载动态库(路径根据实际情况调整)
lib_path = os.path.join(os.path.dirname(__file__), 'libSwiftLib.dylib')
swift_lib = ctypes.CDLL(lib_path)

# 调用函数
result_add = swift_lib.add_numbers(10, 20)
result_mul = swift_lib.multiply_numbers(10, 20)

print(f"加法结果: {result_add}")  # 输出: 加法结果: 30
print(f"乘法结果: {result_mul}")  # 输出: 乘法结果: 200

关键说明:

  1. 数据类型映射:Swift 的 Int32 对应 ctypes 的 ctypes.c_int32(通常自动转换)。
  2. 字符串处理:传递字符串时需转换为 UnsafePointer<CChar>(Swift)和 ctypes.c_char_p(Python)。
  3. 内存管理:涉及内存分配时,需在 Swift 中提供释放函数供 Python 调用。

一句话建议:用 C ABI 作为中间层,Swift 编译成动态库供 Python 调用。

python 作为脚本处理,这样可行?

回到顶部