在 Swift OS X 应用程序中使用 Python 模块

3

我该如何将一个Python模块集成到OS X应用程序中,以便我可以从Swift调用Python?似乎大部分信息都已经过时了,我想确保自己走在正确的道路上。


1
“似乎大部分的信息都已经过时了”这种说法太笼统了。你具体找到了哪些信息?为什么它们已经过时了?你是否在现有答案下留言并要求更新? - Martin R
1个回答

4
答案取决于你的Python有多复杂,以及你需要什么回报。这是一个超级基本的例子,只需通过Swift中的C接口使用Python(确保添加Python.framework):
import Python

Py_Initialize()

let a = PyInt_FromLong(1)
let b = PyInt_FromLong(2)
let c = PyNumber_Add(a, b)

let result = PyInt_AsLong(c)
print("Result is \(result)") // will print 'Result is 3'

对于更复杂的事情,它变得更加复杂:

import Python

Py_Initialize()

// call urllib.urlopen('http://icanhazip.com').read()
let module = PyImport_Import(PyString_FromString("urllib"))
let urlOpenFunc = PyObject_GetAttrString(module, "urlopen")
if urlOpenFunc != nil && PyCallable_Check(urlOpenFunc) == 1 {
    let args = PyTuple_New(1)
    PyTuple_SetItem(args, 0, PyString_FromString("http://icanhazip.com"))
    let openCall = PyObject_CallObject(urlOpenFunc, args)
    let readCall = PyObject_CallObject(PyObject_GetAttrString(openCall, "read"), nil)
    if readCall != nil {
        if let result = String.fromCString(PyString_AsString(readCall)) {
            print("My IP is \(result)")
        } else {
            print("Failed")
        }
    }
}

如果你想在Python中进行一些严肃的工作,要么确保由Swift调用的接口非常简单易懂,要么使用PyObjC。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接