繁体   English   中英

我无法使用 PythonKit 在 Xcode 11 中导入 Python 模块

[英]I can't import Python modules in Xcode 11 using PythonKit

我现在正在使用 Swift 包管理器。

使用它,我将 PythonKit 导入到我的 Swift 项目中。

我现在无法使用 PythonKit 导入 Python 模块。

它要求我设置 PYTHON_LIBRARY 路径,但我不知道该怎么做。

谁能帮我?

//
//  ViewController.swift
//  VideoStream
//
//  Created by HeRo Gold on 7/20/19.
//  Copyright © 2019 TopAce. All rights reserved.
//

import UIKit
import PythonKit

let sys = Python.import("sys")

class ViewController: UIViewController {

    @IBOutlet weak var netflixView: WKWebView!
    let netflixURL = URL(string: "https://www.netflix.com/login")

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let pymsl = try Python.import(name: "pymsl")

        print("Python \(sys.version_info.major).\(sys.version_info.minor)")
        print("Python Version: \(sys.version)")
        print("Python Encoding: \(sys.getdefaultencoding().upper())")
    }
}

这是我在 iPhone 上运行 iOS 应用程序时出现的错误消息

致命错误:未找到 Python 库。 使用 Python 库的路径设置 PYTHON_LIBRARY 环境变量。:文件 /Users/herogold/Library/Developer/Xcode/DerivedData/VideoStream-cjytedddvtktmybclqlztmfdbekk/SourcePackages/checkouts/PythonKit/PythonKit/PythonLibrary.swift,第 40 行
2019-07-20 23:55:00.967869+0800 VideoStream[31841:170718] 致命错误:找不到 Python 库。 使用 Python 库的路径设置 PYTHON_LIBRARY 环境变量。:文件 /Users/herogold/Library/Developer/Xcode/DerivedData/VideoStream-cjytedddvtktmybclqlztmfdbekk/SourcePackages/checkouts/PythonKit/PythonKit/PythonLibrary.swift,第 40 行

第一个 SO 答案,所以请原谅格式化/等。我自己经历了一段时间,有不同的错误,但通常是相同的问题。 我希望这对您有所帮助——需要考虑的一些资源:

1) Pyto ——iOS/Catalyst 的完全嵌入式 Python 环境; 使用 LXML 和 Python 库移植指令<--这是您在 iOS 上运行后需要建模的内容,我的解决方案适用于 Mac Catalyst (预装 Python 的 Mac)

2) Python Kit Tutorial——这家伙一步一步地经历了如何实现PythonKit

这对我有用:

1)在Signing and Capabilities中禁用App Sandbox:

在 App Sandbox 的右上角,在 Signing & Capabilities 下有一个“X”,点击它来移除 App Sandbox

2)在签名和功能下的“强化运行时”中:选中“禁用库验证”

禁用库验证复选框的图像

现在,我还没有根据这些规定向 App Store 提交应用程序,但至少我的 python 文件和库加载/构建/运行!


2020 年 5 月 15 日更新:

对于 Mac Developer Distribution,您必须对应用程序中包含的所有 .so 或 .dylib 以及 Python Interpreter 和 bin 文件夹进行签名。 使用 dev 完成后,我制作了一个快速 bash 脚本来运行每个脚本。

function signThese() {
        find . -name "*.$1" | while read line; do
                codesign --force --verbose=4 --options=runtime --timestamp --sign "Developer ID Application: [INSERT YOUR CERT HERE]" $line
        done
}


这将允许您在签名和功能中使用 AppSandbox,以及所有强化运行时选项(如不禁用库验证)。

iOS 没有 python 解释器。 这就是它无法理解任何 pyhtonkit api 的原因。 所以这适用于 MacOS 的方式不适用于 iOS。 出于同样的原因,Pythonkit 不支持 iOS,并且没有经过同样的测试。

你可以使用我的 PythonKit 分支。 https://github.com/kewlbear/PythonKit这个 Swift 包将 Python 嵌入到您的应用程序中。

它曾经对我有用,但随着最近的 MacOS 更新,它停止了,上面列出的放松应用程序安全设置的解决方案对我不起作用。 只有将 python 库添加到应用程序才能解决它。 您可以:

  • 添加构建阶段步骤以将 python 库(在我的情况下为 libpython3.8.dylib,但我复制了整个文件夹)复制到应用程序资源。 我将它复制到内容/资源/Python。 您可能需要签名。

  • 在第一次调用 PythonKit 之前设置一个环境变量指向库

    let bundlePath = Bundle.main.bundlePath let python_lib_path = "\(bundlePath)/Contents/Resources/Python/libpython3.8.dylib" setenv("PYTHON_LIBRARY", python_lib_path, 0)

这种方法的优点(和缺点)是您自己分发它时不依赖安装在最终用户机器上的 Python。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM