【问题标题】:Python: Handle globbing within a scriptPython:在脚本中处理通配符
【发布时间】:2013-08-21 20:18:26
【问题描述】:
$ script.py *.txt

我想对该目录中的所有 .txt 文件运行 script.py,包括 1.txt、2.txt 和 3.txt。我可以想到两种方法:让 python 脚本处理 globbing,或者让 shell 产生多个进程。

让脚本句柄通配是我更喜欢的方法。

根据Prevent globbing after variable substitution 我可以使用set -f 将其关闭。我如何才能专门为 Python 脚本指定此选项?

【问题讨论】:

  • 第三种方法怎么样:让shell产生一个带有多个参数的进程。这是正常的、默认的工作方式,并且在 Python 脚本中很容易处理(通过循环 sys.argv[1:] 或使用 fileinput)。
  • 这是个好主意,但我希望它适用于接受可变数量参数的不同脚本,包括当我使用 optparseargparse 时。
  • 我根本不明白这是个问题。几乎任何 Unix 系统附带的所有工具,以及您会在那里找到的 90% 的第三方程序和脚本,都使用 optparseargparse 或其他库,并采用可变数量的参数,并且与 shell globbing 一起工作得很好。如果你没有,那么你可能设计的界面错误,这就是你需要修复的地方。
  • 嗯,我认为你是对的。我猜你的意思是,将其包装在一个 shell 脚本中,该脚本将使用$@ 扩展参数?如果您在答案中写出来,我会接受它
  • 我想过建议,但实际上,你甚至不需要那个。如果您的 script.py 可以处理多个输入文件(即,解析出选项后留下的多个参数),就像 ls 一样,那么 shell globbing 在第一名。有一些工具这样的接口是不合理的(例如,ImageMagick 的 convert 有散布在参数之间的选项;find 显然需要做自己的 blobing...),但它们是一个罕见的例外,而不是规则。为什么你认为你的剧本是个例外?

标签: python shell glob


【解决方案1】:

如果出于某种原因您需要在脚本中进行吞噬(例如,计算已处理的文件总数),则可以使用:

script.py '*.txt'

script.py "*.txt"

【讨论】:

  • 这很好用。对于不带引号运行的命令,有没有办法自动修补每个参数周围的引号?
  • @Brian 据我所知,不是逐个命令。通过set -f 在全球范围内,或通过引用。
【解决方案2】:

为什么要通过 Python globbing 执行此操作?恕我直言,shell 脚本将是完美的,并且您将 python 脚本应该执行的核心功能与为目录中的所有 *.txt 文件运行它的琐碎任务分开。

【讨论】:

  • 正如@mario 指出的那样,在某些情况下,脚本可能需要处理来自其他文件的元数据。不过也不反对。我也不确定如何将 python 别名为 shell 脚本。
  • 您是在问如何从 shell 脚本调用 python 脚本吗?假设python 在您的$PATH 中已经存在,那么shell 脚本中的python myScript.py 行就可以了
【解决方案3】:

如果目录中有大量文件,iglob() 会更好。您必须将 glob 参数作为字符串传递:

$ script.py "*.txt"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2017-12-06
    • 2015-09-11
    • 2015-12-13
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多