如何在 python 中使用 swift 包?

How can I use a swift package in python?

我正在尝试将 Swift 函数连接到 Python。 Python 可以解释 .dylib.

中的任何 @_cdecl 函数

对于具有单个 Swift 源的项目目录:

project/
    test.swift
    test.py

我可以运行 swiftc test.swift -emit-library 生成.dylib 文件。

更高级,使用Swift包,看起来像这样:

project/
    TestPackage/
        ...
    test.py

在我的 Swift 包中,我可以将 -emit-library 参数传递给 swift 构建中的 Swift 编译器,如下所示:swift build -Xswiftc -emit-library。这会将我的包导出到 .dylib。

我的问题是将依赖项添加到我的包中。我添加了 SwifterSwift 包作为依赖项只是为了测试,运行 swift build -Xswiftc -emit-library。我收到此错误:

swift build -Xswiftc -emit-library
Undefined symbols for architecture x86_64:
  "_$s10Foundation4DateV12SwifterSwiftE11weekOfMonthSivg", referenced from:
      _$s11TestPackage6swiftyyyF in TestPackage.swift.o
ld: symbol(s) not found for architecture x86_64
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation)

但是,看起来 SwifterSwift 成功导出了 .dylib。但是我的主要项目 TestPackage 没有。 swift build 确实可以自己工作,但没有达到我生成 .dylib 的目标。

问题:

如何让整个包编译为带有依赖项的 .dylib?我是否缺少链接器命令?

经过数小时的 swift buildswiftc 变体试验后,我找到了更简单的解决方案:

在清单中,将类型设置为动态。

.library(name: "TestPackage", type: .dynamic, targets: ["TestPackage"]),

swift build 之后(没有花哨的参数),.dylib 位于:

TestPackage/.build/x86_64-apple-macosx/debug/libTestPackage.dylib

现在我可以使用 Python 中的一些 Swift 包了!