Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中递归控制台工具的最佳实践_Python_Command Line - Fatal编程技术网

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