当捆绑包可执行文件是Bash脚本时,将参数传递给macOS应用

时间:2019-06-10 19:37:53

标签: bash macos bundle

我已经按照我在StackOverflow和其他地方找到的说明创建了一个.app(一个macOS捆绑软件),其中的主要可执行文件是一个Bash脚本。除了我双击与.app关联的文件时,该脚本可以运行,但它不会将单击的文件名作为参数。

看起来像问题在于脚本无法处理“ OpenFile”事件,但我不知道用户是否可以通过某种方式双击文件并将文件名传递给.app捆绑包可以作为命令行参数而不是通过某些事件来执行。

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

我知道我可以使用py2app来实现类似的东西,或者使用Platypus或Automator等等。但是使用Bash脚本更适合我的工作流程,并且我很好奇,当文件加倍时,macos如何将参数传递给应用程序单击。

非常感谢!

1 个答案:

答案 0 :(得分:0)

最后我找到了方法。比我想象的要简单,而且不容易找到,但是...

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函数可以做更多的事情,但是我想展示完成这项工作所需的最低限度的要求。希望对您有所帮助!