PythonKit падает при запуске из-за возврата dlopen, равного нулю - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь использовать некоторый код Python в своем проекте Swift с PythonKit.Чтобы сделать это, я скачал новый Xcode 11, чтобы добавить PythonKit как Swift Package.После добавления PythonKit с пакетом Swift у меня есть эти зависимости проекта прямо здесь.

Project Dependencies

Я хочу использовать свой код 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 в моем случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...