在 Linux 中,许多程序都有 CLI 版本和 GUI 前端。我在某处读到这遵循 Linux 哲学并且是很好的实践。当然,从开发人员的角度来看,将 GUI 代码与实际程序分开是正确的。
给定一个可以从命令行愉快使用的程序,我想为命令行版本创建一个 GUI。我在这里有什么选择?
我只能想到 GUI 开发人员会使用的 2 个。
使用配置的参数调用程序,如下所示:
系统(“某个程序--参数1 -p2 -p3”)
让 CLI 版本能够使用套接字(unix、inet...)在服务器模式下运行,并使用这些套接字与“服务器”进行通信
在我看来,最干净的解决方案是第二个,但如果不改变 CLI 版本,这并不总是可能的。
实际的问题是分别构建 cli 版本和 GUI 版本的正确方法是什么?
答案1
另一种方法是将您的功能编写为库。然后你就有了一个使用该库的 GUI;以及一个也使用该库的 CLI。根据任务的复杂性,这可能是最好的解决方案,因为两个程序都可以独立工作,不需要任何类型的进程间通信。
答案2
如果程序的执行相对无国籍的,或者它不是交互式的,或者它通常只是运行完成,那么第一个选项是最简单且最合适的。
如果程序是有状态的,或长时间运行,那么第二个选项是最合适的,尽管更复杂。
想想 FTP:使用curl
或wget
编写下载脚本与使用expect
编写交互式 ftp 会话脚本相比,在每种情况下可能都没有正确的答案。
有趣的研究案例包括:
nmap
可以以 XML 形式提供所有复杂的有用输出,并在扫描期间提供反馈,一旦开始,您只需坐下来等待gpg
由于 CLI 与 GUI 电子邮件客户端集成有着悠久的历史,因此它使用文件描述符进行输入和输出xmlclitools
具有有趣的双模式操作,独立模式和客户端/服务器模式
答案3
您计划在 GUI 中使用什么语言?根据调用猜测 C/C++ system()
。你也可以使用Python的os.exec*()或者os.system()函数或许多其他语言中的类似函数,包括另一个调用的 shell 脚本禅意,亚德或者GTK对话框用于 GUI 交互。
使用C/C++ system() 函数有一些注意事项。由于大多数其他语言编译器和解释器都是用 C/C++ 编写的,因此它们的等效函数/方法通常存在相同的问题。谨慎使用。
这Puppy Linux 社区广泛使用 GTKDialog从 bash shell 脚本调用,因为它支持大多数常用的 GTK+ GUI 小部件。类似 XML 的 GTKDialog 代码嵌入在export
ed shell 脚本字符串中,该字符串在对可执行文件的调用中传递gtkdialog
。因此,所有代码都保留在同一个文件中。
亚德是一个叉子禅意倍增禅尼蒂的GTK+ GUI 功能非常强大,是我目前的首选工具。
交互式GUI和功能代码也可以在同一个脚本中,如果需要,可以使用命令行选项选择 GUI、CLI 或 API(非交互式)。更好的是在启动时进行内部检测,并自动选择适当的接口。