swift - 运行 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
解决方案
推荐阅读
- python - Python Selenium 找不到 xpath
- python - Flask:函数输出未按预期解析
- c# - C# 将句子转换成字符串
- react-native - 从 Google ML Kit Mobile Vision API 获取检测到的人脸俯仰角
- python-3.x - 替换外部文件中文本的特定部分
- arrays - 无法检索要显示的选定图像 URL - Firebase / Swift
- python-3.x - 对包含元组列表的 pandas DataFrame 列中的第一个元素求和返回 ValueError
- puppeteer - 无法抓取网站运行代码时出错。TimeoutError: Navigation Timeout Exceeded: 超过 30000ms
- javascript - 如何阻止用户在某个点滚动?
- reactjs - 设置用户后组件不会重新渲染