簡體   English   中英

當bundle可執行文件是Bash腳本時,將參數傳遞給macos app

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

我已經創建了一個.app(一個macOS包),其中主要的可執行文件是一個Bash腳本,遵循我在StackOverflow和其他地方找到的指令。 它完美地工作,除了當我雙擊與.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如何在雙擊文件時將參數傳遞給應用程序。

非常感謝提前!

最后我找到了方法。 比我想象的要簡單,但要找到它並不容易......

Bash啟動程序不會在命令行中獲取任何內容,因為這不是macOS處理應用程序包中的參數的方式,而是使用Apple Events。 我不知道這一點,這是我的錯,我缺乏macOS的專業知識。

原來tkinter居然還支持Apple事件,至少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函數做了更多的事情,但我想展示使這項工作所需的最低限度。 我希望對你有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM