我正在构建一个命令行实用程序,需要六条信息才能正常工作。它看起来像这样:
fm-git filename repository path comment username password
然而,在任何单独的系统上,username
并且password
将是恒定的。
执行该实用程序时,我发现很难构建。例如,下面是对该实用程序的一次测试调用(为了便于阅读,分成多行):
/Users/chuck/Projects/fm-git/fm-git.py chiv-lib
/Users/chuck/Projects/chiv-lib/ Chivalry/ "continued testing"
Administrator abc1234
我正在考虑通过不同的方式来传递这些论点。例如,fm-git -f filename -r repository ...
或fm-git --filename filename --repository repository...
。我还在考虑进行username
和password
参数配置设置,因为它们通常不会改变,然后可以从实用程序调用中删除它们。
当实用程序参数很多但又是必需的时,维持实用程序调用可读性的公认做法是什么?
答案1
通常,unix 应用程序允许多种方式来提供此信息,更“具体”的方式会覆盖不太具体的方式。
所以你有了:
对于图形应用程序,所使用的工具包几乎总是提供某种方式来获取资源(例如
xrdb
纯 X 中的 -style 等)配置文件(如果工具包尚未提供)。
命令行选项,包括短格式和长格式(
getopt
在 C 中很容易使用)如果没有给出信息,则合理的默认值,例如路径的当前目录
位置参数仅对少数强制参数有意义,后面可能是文件列表(因为通配符规范扩展到多个参数)。六件单独的作品太多了;该顺序很难记住,因此请使用这些选项。
对于密码,提供一种使应用程序从 stdin 读取密码的方法可能会有所帮助,可能通过使用特殊值(例如--password -
或-p -
)。
使用该应用程序的任何人都可以选择硬编码密码、配置文件中的密码或让用户输入密码是否是特定用例的最佳选择。
答案2
一般来说,最好:
- 计算依赖参数,但允许重新定义它们:例如,在您的示例中,您具有
filename
与 相同的参数$(basename repository)
,因此您可能只需要存储库,但可以选择--filename
提供替代文件名。 - 从命令行和
ps
输出中隐藏身份验证。将它们放在某个文件中:可能是$HOME/.fm-git.conf
,给文件更多限制,例如chmod 600 $HOME/.fm-git.conf
从文件中读取它们。有时,它也可以从环境变量中获取用户名和密码(例如默认用户名是您的系统用户名或SUDO_USER
),但可能不是您的情况。
因此,经过两次优化后,您只有 3 个 cli 参数,我认为这是可以接受的。随意使用它们作为位置参数或提供一些标志,例如--comment
:如果您进一步在脚本中使用程序,提供长标志将增强可读性,但如果您主要从 cli 手动运行程序,则需要输入更多内容。
无论如何,当你用 Python 编写程序时,我建议你使用argparse模块-- 它将帮助您解析参数并在将来如果您想更改它们时进行更改。