如何在 macOS 的 Python 项目中使用 Swift dylib?

问题描述 投票:0回答:1

我使用命令创建了简单的 Swift 包

cd 桌面

mkdir AICore

cd AICore

swift package init --类型库

并将配置编辑为动态库配置,如下所示,

Package.Swift

// swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "AICore",
    platforms: [.macOS(.v10_15)],
    
    products: [  
        .library(name: "AICore", type: .dynamic, targets: ["AICore"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "AICore",
            dependencies: [])
    ]
)

AICore.swift:

import Cocoa
 
public func launchMyAppKitWindow() {
    let app = NSApplication.shared
    let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 400, height: 300), styleMask: [.titled, .closable, .resizable], backing: .buffered, defer: false)
    window.center()
    window.title = "My AppKit Window"
    window.makeKeyAndOrderFront(nil)
    app.run()
}

项目结构:

├── AICore
│   ├── Package.swift
│   ├── README.md
│   └── Sources
│       └── AICore
│           └── AICore.swift
└── Test
    ├── libAICore.dylib
    └── main.py

我已经使用 swift build 编译了我的 swift 程序,并且取消隐藏了 AICore 父文件夹中的 hidden build 文件夹。图书馆位于

build->x86_64-apple-macosx->libAICore.dylib

我复制了库并粘贴到 Test 文件夹,其中包含以下要测试的 python 脚本。

import ctypes
# https://docs.python.org/3/library/ctypes.html
# Load the dylib
my_appkit_lib = ctypes.CDLL("/Users/YxT2/Desktop/PY/Test/libAICore.dylib")

# Call the launch function
my_appkit_lib.launchMyAppKitWindow()

我使用命令

python3 main.py
运行代码并收到以下错误

Traceback (most recent call last):
  File "/Users/YxT2/Desktop/PY/Test/main.py", line 7, in <module>
    my_appkit_lib.launchMyAppKitWindow()
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 389, in __getattr__
    func = self.__getitem__(name)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 394, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: dlsym(0x21db45be0, launchMyAppKitWindow): symbol not found

我测试了我的快速代码,它实际上启动了下面屏幕截图中显示的窗口。

但是我想使用这个测试库来Python代码调用

launchMyAppKitWindow
用Swift编写的函数,任何人都可以帮我解决这个问题吗?

python python-3.x swift cocoa dylib
1个回答
0
投票
  1. 无法从 Python 直接访问 Swift 函数,因为 Swift 使用不同的应用程序二进制接口 (ABI)。为了使该函数可访问,您应该使用 @_cdecl 属性来标记它以使用 C ABI。像这样修改你的 AICore.swift:
    import Cocoa
    
    @_cdecl("launchMyAppKitWindow")
    public func launchMyAppKitWindow() {
      ...
    }
  1. main.py - 检查库路径。

    -- 这行错误 --

my_appkit_lib = ctypes.CDLL("/Users/YxT2/Desktop/PY/Test/libAICore.dylib")  

  1. OS X“lib sat.dylib”

    创建“libsit.so”(或在 OS X 上,“libsit.dylib”)

    swiftc -emit-library YOUR.swift

参考: https://gist.github.com/jiaaro/e111f0f64d0cdb8aca38

© www.soinside.com 2019 - 2024. All rights reserved.