【问题标题】:Making Python scripts work with xargs使 Python 脚本与 xargs 一起工作
【发布时间】:2012-08-04 21:26:10
【问题描述】:

让我的 Python 脚本与“xargs”一起工作的过程是什么?例如,我希望以下命令遍历文本文件的每一行,并执行任意命令:

cat servers.txt | ./hardware.py -m 

基本上希望每一行都传递给 hardware.py 脚本。

【问题讨论】:

  • 你在那里显示的是标准输入,但你的是xargs。它们不是同一件事。你想要哪个?
  • 有什么特别的原因你不能只在 python 中读取文本文件吗?
  • 管道只是将catstdout连接到hardware.pystdin。因此,在 hardware.py 中,您应该只从 stdin 读取数据(例如 data = raw_input())。

标签: python xargs


【解决方案1】:

要使您的命令与xargs 一起工作,您只需要它们接受参数即可。 Python 中的参数位于sys.argv 列表中。通过这种方式,您可以执行以下操作:

find . -type f -name '*.txt' -print0 | xargs -0 ./myscript.py

可能相当于

./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt

要使您的命令使用标准输入,您还可以使用sys 模块,这次使用sys.stdin,您可以将其视为文件。这更像你给出的例子:

./myscript.py < somefile.txt

【讨论】:

    【解决方案2】:

    您混淆了两个问题。

    首先,您的应用程序可以接收来自标准输入的输入。这与xargs 无关。在您的示例中,所有hardware.py 需要做的就是读取sys.stdin 作为输入文件,例如:

    if __name__=='__main__':
        for line in sys.stdin:
             do_something(line)
    

    如果您希望 hardware.py 产生其他程序可以使用的输出,只需写信至sys.stdout

    其次,您的应用程序可以接收来自参数的输入。这是您将使用xargs 的地方。例如:

    xargs ./hardware.py

    这会将servers.txt 的每个“单词”(不是每个)作为参数传递给hardware.py(一次可能有多个参数)。这与运行hardware.py word1 word2 word3 word4 ...

    相同

    Python 将命令行参数存储在 sys.arvg 数组中。 sys.argv[0] 将是命令名称,sys.argv[1:] 将是所有命令行参数。但是,您通常最好使用argparse 处理命令行。

    【讨论】:

      【解决方案3】:

      不清楚你想做什么。如果./hardware.py -m 从标准输入读取一行,您可以使用 GNU Parallel 分发这些行:

      cat servers.txt | parallel --pipe -N1 ./hardware.py -m
      

      如果./hardware.py -m 将单个服务器作为参数,您可以这样做:

      cat servers.txt | parallel ./hardware.py -m
      

      您可以通过以下方式安装 GNU Parallel:

      wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
      chmod 755 parallel
      cp parallel sem
      

      观看 GNU Parallel 的介绍视频以了解更多信息: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 2021-09-26
        • 1970-01-01
        • 2019-02-02
        相关资源
        最近更新 更多