首页 > 解决方案 > 运行 macOS 可执行文件时如何访问“标准输出”?

问题描述

问题:
我正在尝试将 unix 可执行文件的标准输入/标准输出连接到 MacOS 应用程序中的用户界面。但是,我似乎无法访问这些值 - 什么也没有出现。

背景:
我已经实现了所有我能找到的解决方案,但没有一个有效 [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][ 9 ]。我已经完成了 Python 3 课程 [ 1 ],因此我可以在可执行文件 [ 1 ] 的 Python 脚本中自定义标准输出。而且,我已经审查并实现了几个可用的 MacOS 存储库,这些存储库使用来自标准输出 [ 1 ][ 2 ][ 3 ]的数据更新其用户界面。

代码: 完整

func runExecutable() {

    let desktop = fileManager.urls(for: .desktopDirectory, in: .userDomainMask)[0]
    let url = Bundle.main.url(forResource: "youtube_dl_custom", withExtension: "")
    let arguments = [
        "--format",
        "bestvideo[ext=mp4]+bestaudio[ext=m4a]",
        "--output",
        "\(desktop)/%(title)s.%(ext)s",
        "\(videoUrlTextField.stringValue)"
    ]
    process.arguments = arguments
    process.executableURL = url
    process.standardInput = inputPipe
    process.standardOutput = outputPipe

    openConsolePipe()

    inputPipe.fileHandleForReading.readabilityHandler = {
        [weak self] fileHandle in

        let data = fileHandle.availableData
        self?.buffer.append(data)
        if let buffer = self?.buffer,
            let string = String(data: buffer, encoding: .utf8),
            string.last?.isNewline == true {

            self?.buffer.removeAll()
            print("## \(string)")
            self?.standardOutputTextView.string += string + "\n"

                self?.outputPipe.fileHandleForWriting.write(data)
            }
        }
    try? process.run()
    closeConsolePipe()
}
func openConsolePipe() {
    dup2(STDOUT_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)
    dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDOUT_FILENO)
    dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)
}
func closeConsolePipe() {
    freopen("/dev/stdout", "a", stdout)
}

结果:
标准输出似乎自动打印到控制台,但我似乎无法访问这些值。

杂项:
使用youtube-dl存储库下载视频 [ 1 ]。为[ 1 ]
使用了自定义 python 脚本。使用 pyinstaller [ 1 ] 转换为可执行文件。 将项目发布到 GitHub 以进行故障排除 [ 1 ]。youtube-dl
youtube-dl

标签: swiftmacospipestdoutnstask

解决方案


推荐阅读