双击文件以运行特定的终端命令

双击文件以运行特定的终端命令

具体来说,我有一个名为nbopen它以 类型的文件作为参数.ipynb。我这样使用它:nbopen mynotebook.ipynb从终端启动 Jupyter Notebooks(一种 Python 脚本)。

我想要的是双击文件(例如mynotebook.ipynb在 Finder 中)使其nbopen mynotebook.ipynb在终端窗口中执行。这样我就不再需要从终端环境启动此类文件(繁琐且重复),我只需双击该文件即可直接启动。

我认为可以通过 Automator 或编写一个小应用程序来实现这一点,但我对 OSX 编程了解不够,不知道应该朝哪个方向发展。如能得到任何帮助,我将不胜感激。

答案1

我有完全相同的用例。受@CJK的启发,我编写了一个脚本应用程序。它并不完美,有很多错误,但可以工作:

property notebookDir : null
property notebookPort : 8888
property jupyterExecutable : "/path/to/a/working/jupyter/executable"

on run
    set notebookDir to choose folder with prompt "Choose the --notebook-dir of the jupyter server. Note that .ipynb_checkpoints directory may be created underneath."
    set notebookDir to POSIX path of notebookDir
    do shell script "/usr/local/bin/tmux new -ds jupyter-opener " & quoted form of jupyterExecutable & " notebook --notebook-dir " & quoted form of notebookDir & " --port " & notebookPort as string
end run

on open args
    repeat with anArg in args
        set theFilePath to POSIX path of anArg
        set theValidatedPath to checkIsOpenableIpynbAndValidate(theFilePath)
        if theValidatedPath is null then
            # seems that this line won't work either
            display alert message "Failed to open " & theFilePath
        else
            open location ("http://127.0.0.1:" & notebookPort as string) & "/notebooks/" & theValidatedPath
        end if
    end repeat
end open

on quit
    do shell script "/usr/local/bin/tmux kill-session -t jupyter-opener"
    continue quit
end quit

on checkIsOpenableIpynbAndValidate(aFilePath)
    try
        set relPath to do shell script "/usr/local/bin/realpath --relative-to " & quoted form of notebookDir & space & quoted form of aFilePath & " | perl -ne 'if(m(^\\.\\./) || !m(\\.ipynb$)){exit 1} else {print}'"
        # struggling to get this line work ...
        #set encodedRelPath to do shell script "echo -n " & quoted form of relPath & " | /usr/bin/python3 -c 'import urllib.parse; print(urllib.parse.quote(input()), end=\"\")'"
        #return encodedRelPath
        return relPath
    on error
        return null
    end try
end checkIsOpenableIpynbAndValidate

因此,对于jupyterExecutable,我将其设置为which jupyter返回的任何值。您应该首先检查是否已安装所有相关的命令行实用程序(如/usr/local/bin/tmux)。将上述代码粘贴到脚本编辑器中。另存为“应用程序”文件格式。并勾选“运行处理程序后保持打开”选项。

用法:

  1. 双击已保存的应用程序图标。
  2. 在弹出的文件夹选择器中,选择要用作--notebook-dir值的目录
  3. 从任意子目录中,将任意 ipynb 文件拖放到 Dock 中的应用程序图标上。默认浏览器中应打开一个显示笔记本的选项卡。
  4. 然后,右键单击 Dock 中的应用程序图标,并选择退出。

机制:

tmux在启动时启动一个运行 jupyter 的会话,并在退出时终止该会话。

您应该知道,jupyter.ipynb_checkpoints无论走到哪里都会留下文件夹(在 下--notebook-dir)。此脚本应用程序不负责清理它。

注意事项:

  • 没有完成 URL 转义。我试过了,但不起作用(参见代码中的注释)
  • 如果您拖放(例如 mp4 文件)或所选笔记本目录父文件夹下的文件,它将无法很好地处理这种情况。我试过了,但它不起作用(另请参阅评论)

希望有人能告诉我如何解决这两个问题。

如果必须通过双击而不是拖放来打开 ipynb 文件,该怎么办?

也许你应该按照@CJK的建议将其设置为默认应用程序。我没有在这里尝试,因为我现在对 applescript 也很了解,而且我还没弄清楚如何通过双击来让它工作。

希望能帮助到你。

相关内容