Python中递归控制台工具的最佳实践
命令行工具的最佳实践(接口和实现)是什么 在目录树中处理选定文件的 我举了一个我想到的例子,但我正在寻找一个“最佳实践”:Python中递归控制台工具的最佳实践,python,command-line,Python,Command Line,命令行工具的最佳实践(接口和实现)是什么 在目录树中处理选定文件的 我举了一个我想到的例子,但我正在寻找一个“最佳实践”: flipcase foo.txt foo2.txt 无法处理foo.txt并将结果保存为foo2.txt flipcase -rv *.txt 无法处理当前目录中的所有文本文件。 -r或-recursive将包括所有子目录。 -v将在处理时将一些信息打印到标准输出 我在这个例子中看到的一个问题是,*.txt参数是 有时通过shell(Unix和Vista)进行扩展,因此
flipcase foo.txt foo2.txt
无法处理foo.txt并将结果保存为foo2.txt
flipcase -rv *.txt
无法处理当前目录中的所有文本文件。-r
或-recursive
将包括所有子目录。-v
将在处理时将一些信息打印到标准输出
我在这个例子中看到的一个问题是,*.txt
参数是
有时通过shell(Unix和Vista)进行扩展,因此我无法应用此模式
当浏览子目录时。我想原因是,在Unix上,这样的工具附带了一个调用
find
,
但这在Windows上似乎并不常见。这也使得打印一张照片变得困难
最后是总结
要求:
- 必须在Unix、Windows XP、Windows 7和Mac上运行
- 应遵循这些平台上的通用约定。
(是的,我知道。但我正在寻求一个合理的妥协。
例如,在Windows上使用
而不是-
是可以的。)/
- 不应该像grep那样依赖单独的find命令
- 必须适用于单个文件、文件模式和目录模式 等级制度
- 应使用标准Python库构建,例如
和OptionParser
os.walk
- 可以处理多种模式,例如
*.txt、*.html
- 此工具应返回什么(状态代码)
- 此工具应处理哪些ctrl键,以及以何种方式处理
- 是否应该支持stdin而不是单个文件?可配置或 自动检测
- 应该支持输出重定向吗?可配置还是自动检测? 在这种情况下,如何处理调试输出
- 模式应该是glob语法还是正则表达式
- 是否有支持递归的通用模式语法?
可能
在这种情况下,不需要使用recursive:.txt
选项-r
- 为修改后的文件创建备份的最佳做法是什么?
选项
,或者在默认情况下有备份,并添加-b
选项--无备份
- 对于单个文件,应该可以指定目标文件名。怎么做
- 应打印哪些状态信息,并对此进行热配置?
默认情况下它应该是详细的,并且我们允许
保持安静吗? 或者总是打印一点,并允许-q
(或-v
)将其或-vv
提升到 完全闭嘴-q
好的示例项目的想法和指针。根据我的经验,最好的起点是构建一个遵循基本Unix原则的工具,即从标准输入读取,然后写入标准输出。这允许人们以灵活的方式使用您的工具:
flipcase input.txt > output.txt
othercommand | flipcase > output.txt
flipcase | othercommand > ouput.txt
flipcase input1.txt input2.txt > output.txt
下一个功能可能是就地编辑:
# Modify input files directly.
flipcase -i input.txt
# Create backup copies before modifying originals.
flipcase -i --backup-suffix '_BAK' input.txt
flipcase -i --backup-prefix 'BAK_' input.txt
# Regex for power users.
flipcase -i --backup-regex 's/foo/bar/' input.txt
在详细模式下,该工具不应写入标准输出,因为这将与上述核心原则相冲突。它应该写入标准错误或用户定义的日志文件
flipcase -v input.txt > output.txt
flipcase -v log.txt input.txt > output.txt
然后,添加递归行为。这里的方向不太明确,但我会抛出一些想法。在典型的递归情况下,程序的参数可能是目录,用户需要提供额外的选项来定义各种类型的过滤行为(即,要处理的文件类型)
最佳实践(界面)是什么
(和实现)用于命令行
在中处理选定文件的工具
目录树
我认为在实现命令行工具时,没有单一的标准或“最佳实践”。尽管如此,通过查看和实验构建良好的工具(例如GNU coreutils),您将获得许多见解
另外,我认为你也在寻找类似的东西:
阅读和试验Unix的方法实际上解决了您在设计决策方面的许多问题
我认为这有一个问题
例如,*.txt参数是
有时通过shell(Unix)进行扩展
和Vista),所以我不能应用这个
遍历子目录时的模式
在Unix中,
*
会自动展开。我不确定Windows,但如果我没有弄错的话,*
没有展开,因此您可以简单地使用glob.glob(sys.argv[1])
。Unix的一个解决方法是避开通配符,但必须有更好的方法 递归处理通常使用来完成,但是您可以创建自己的版本来使用Python生成器,这对命令行友好得多:管道将在处理过程中获得输出。这是
使用Python3,您不必这样做,因为它提供了创建生成器的功能
然后,按照FM的建议使用创建CLI界面。为了解决问题中的全局部分,列表中的一个奇怪的人实际上支持Windows。UNIX的方法,也是一种很好的方法,是让shell处理globbing。你只需要得到一个文件列表。我不知道任何UNIX工具能够自己进行全局绑定(在这样的基本情况下)。我建议你也不要自己做,而是依靠贝壳 在Windows上,您可以让人们使用带有Cygwin的shell,或者类似的东西。当然,Windows用户通常不使用命令行,因此如果您构建GUI,他们也会很高兴 这不包括您的
-r
开关。但这很难做到。是否要向用户提供指定“扩展名为.txt的子目录中的所有文件”的功能?请注意,像ZSH这样的现代shell可以执行递归到目录中的glob,如:
rm **/*.tmp
rm **/*.tmp