将程序 GUI 前端和 CLI 功能分开

将程序 GUI 前端和 CLI 功能分开

在 Linux 中,许多程序都有 CLI 版本和 GUI 前端。我在某处读到这遵循 Linux 哲学并且是很好的实践。当然,从开发人员的角度来看,将 GUI 代码与实际程序分开是正确的。

给定一个可以从命令行愉快使用的程序,我想为命令行版本创建一个 GUI。我在这里有什么选择?

我只能想到 GUI 开发人员会使用的 2 个。

  • 使用配置的参数调用程序,如下所示:

    系统(“某个程序--参数1 -p2 -p3”)

  • 让 CLI 版本能够使用套接字(unix、inet...)在服务器模式下运行,并使用这些套接字与“服务器”进行通信

在我看来,最干净的解决方案是第二个,但如果不改变 CLI 版本,这并不总是可能的。

实际的问题是分别构建 cli 版本和 GUI 版本的正确方法是什么?

答案1

另一种方法是将您的功能编写为库。然后你就有了一个使用该库的 GUI;以及一个也使用该库的 CLI。根据任务的复杂性,这可能是最好的解决方案,因为两个程序都可以独立工作,不需要任何类型的进程间通信。

答案2

如果程序的执行相对无国籍的,或者它不是交互式的,或者它通常只是运行完成,那么第一个选项是最简单且最合适的。

如果程序是有状态的,或长时间运行,那么第二个选项是最合适的,尽管更复杂。

想想 FTP:使用curlwget编写下载脚本与使用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 代码嵌入在exported shell 脚本字符串中,该字符串在对可执行文件的调用中传递gtkdialog。因此,所有代码都保留在同一个文件中。

亚德是一个叉子禅意倍增禅尼蒂的GTK+ GUI 功能非常强大,是我目前的首选工具。

一般方法为GTK对话框,禅意亚德是...

  • 编写一个 shell 脚本,通过一次或多次调用以交互方式收集参数GTK对话框,禅意或者亚德(或者,任何或全部)
  • 使用收集的参数执行命令行程序

交互式GUI和功能代码也可以在同一个脚本中,如果需要,可以使用命令行选项选择 GUI、CLI 或 API(非交互式)。更好的是在启动时进行内部检测,并自动选择适当的接口。

相关内容