运行macOS可执行文件时如何访问“标准输出”?

时间:2019-08-10 17:53:36

标签: swift macos pipe stdout nstask

问题:
我试图将标准输入/标准输出从UNIX可执行文件连接到MacOS应用程序的用户界面。但是,我似乎无法访问这些值-没有任何显示。

背景:
我已经实现了我能找到的所有解决方案,但没有一个起作用[[1] [2] [3] [4] [{{3} }] [5] [6] [7] [8]。我已经完成了Python 3课程[9],以便可以在可执行文件[1]的python脚本中自定义标准输出。而且,我已经查看并实现了几个工作的MacOS存储库,这些存储库使用标准输出[1] [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存储库下载视频[Full]。
youtube-dl [1]使用了自定义python脚本。
使用pyinstaller [1]将youtube-dl转换为可执行文件。
将项目发布到GitHub进行故障排除[1]。

0 个答案:

没有答案