Я пытаюсь использовать некоторый код Python в своем проекте Swift с PythonKit.Чтобы сделать это, я скачал новый Xcode 11, чтобы добавить PythonKit как Swift Package.После добавления PythonKit с пакетом Swift у меня есть эти зависимости проекта прямо здесь.
Я хочу использовать свой код Python в начале моего приложения, поэтому я поместил вызов кода Python в мой делегат приложения, в функцию приложения.
import UIKit
import PythonKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let sys = Python.import("sys")
print("Python Version: \(sys.version)")
sys.path.append("/Users/me/Documents/MyProject/MyPackage/my_python_main_file")
let pythonAPI = Python.import("my_python_main_file")
pythonAPI.main_function.call()
return true
}
После запуска проекта я получаю следующую ошибку:
Неустранимая ошибка: библиотека Python не найдена.Установите переменную окружения PYTHON_LIBRARY, указав путь к библиотеке Python.
Я попытался выполнить различные шаги с помощью точек останова, чтобы узнать, где код на самом деле дает сбой.Итак, вот различные этапы, через которые проходит PythonKit:
Он входит в PythonLibrary init()
и выдает ошибку:
guard let pythonLibraryHandle = PythonLibrary.loadPythonLibrary() else {
fatalError("""
Python library not found. Set the \(Environment.library.key) \
environment variable with the path to a Python library.
""")
}
После исследования это происходит из-за вызова dlopen
внутри loadPythonLibrary
функции
static func loadPythonLibrary(at path: String) -> UnsafeMutableRawPointer? {
log("Trying to load library at '\(path)'...")
#if canImport(Darwin) || canImport(Glibc)
// Must be RTLD_GLOBAL because subsequent .so files from the imported python
// modules may depend on this .so file.
let pythonLibraryHandle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL)
#elseif os(Windows)
let pythonLibraryHandle = UnsafeMutableRawPointer(LoadLibraryA(path))
#endif
if pythonLibraryHandle != nil {
log("Library at '\(path)' was sucessfully loaded.")
}
return pythonLibraryHandle
}
Эта функция возвращает nil
, что связано с функцией dlopen
, возвращающей nil
.
Однако я проверил путь, указанный в качестве параметра для loadPythonLibrary(at : path)
, и он оказался правильным (в Терминале я попытался сделать cd
по следующему пути, и это сработало):
/ usr / local / Frameworks / Python.framework / Versions / 2.7 / Python
Я использую Python 2.7 в своем коде.
Знаете ли вы, почему dlopen
вернул бы nil
в моем случае?