当捆绑可执行文件是 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
功能可以做更多的事情,但我想展示完成这项工作所需的最低限度。希望对您有所帮助!
我创建了一个 .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
功能可以做更多的事情,但我想展示完成这项工作所需的最低限度。希望对您有所帮助!