当捆绑可执行文件是 Bash 脚本时将参数传递给 macos 应用程序

Passing arguments to macos app when bundle executable is a Bash script

我创建了一个 .app(一个 macOS 包),其中主要可执行文件是一个 Bash 脚本,遵循我在 Whosebug 和其他地方找到的说明。它工作完美,除了当我双击与 .app 关联的文件时,脚本是 运行 但它没有将单击的文件名作为参数。

看起来问题是脚本没有处理"OpenFile"事件,但我不知道是否有用户双击文件并将文件名传递给的方法.app 捆绑可执行文件作为命令行参数而不是通过某些事件。

#! /usr/local/bin/bash
source ~/.bashrc
python3 final_script.py 
# Above, "" is empty. I've tried some variations,
# including not running the second script, to no avail. 

我知道我可以使用 py2app 或 Platypus 或 Automator 等来实现类似的功能,但使用 Bash 脚本更适合我的工作流程,而且我很好奇 macos 如何将参数传递给双击文件时的应用程序。

提前致谢!

终于找到方法了。比我想象的简单,也不容易找到但是...

Bash 启动器不会在命令行中获取任何内容,因为这不是 macOS 处理应用程序包中参数的方式,它使用 Apple Events。我不知道这一点,这是我的错,我对 macOS 缺乏专业知识。

事实证明 tkinter 实际上支持 Apple Events,至少支持 odoc 事件,这是当用户双击要由应用程序打开的文档时应用程序包获得的事件。

所以,我所做的就是修改 final_script.py,添加以下代码:

import sys
import tkinter

def handle_opendocument(widget, *args):
    message = ''
    for arg in args:
        message += str(arg) + '\n'
    widget.configure(text=message.rstrip())
...
# More code here...
...

root = tkinter.Tk()

root.title('Testing AppleEvent handling in Python/Tk')
root.createcommand('tk::mac::OpenDocument', lambda *args: handle_opendocument(label, *args))

label = tkinter.Label(root)
label.configure(text='Starting up...')

label.pack()

root.mainloop()

当然,我的应用程序中真正的 handle_opendocument 功能可以做更多的事情,但我想展示完成这项工作所需的最低限度。希望对您有所帮助!