具体来说,我有一个名为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
)。将上述代码粘贴到脚本编辑器中。另存为“应用程序”文件格式。并勾选“运行处理程序后保持打开”选项。
用法:
- 双击已保存的应用程序图标。
- 在弹出的文件夹选择器中,选择要用作
--notebook-dir
值的目录 - 从任意子目录中,将任意 ipynb 文件拖放到 Dock 中的应用程序图标上。默认浏览器中应打开一个显示笔记本的选项卡。
- 然后,右键单击 Dock 中的应用程序图标,并选择退出。
机制:
它tmux
在启动时启动一个运行 jupyter 的会话,并在退出时终止该会话。
您应该知道,jupyter.ipynb_checkpoints
无论走到哪里都会留下文件夹(在 下--notebook-dir
)。此脚本应用程序不负责清理它。
注意事项:
- 没有完成 URL 转义。我试过了,但不起作用(参见代码中的注释)
- 如果您拖放(例如 mp4 文件)或所选笔记本目录父文件夹下的文件,它将无法很好地处理这种情况。我试过了,但它不起作用(另请参阅评论)
希望有人能告诉我如何解决这两个问题。
如果必须通过双击而不是拖放来打开 ipynb 文件,该怎么办?
也许你应该按照@CJK的建议将其设置为默认应用程序。我没有在这里尝试,因为我现在对 applescript 也很了解,而且我还没弄清楚如何通过双击来让它工作。
希望能帮助到你。