5

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

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

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

4

3 回答 3

6

要使您的命令与您一起工作,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
于 2012-08-07T20:07:44.063 回答
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 # 同 cat servers.txt | xargs ./hardware.py

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

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

于 2012-08-07T20:09:18.290 回答
0

目前还不太清楚你想做什么。如果./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

于 2012-08-08T15:46:39.420 回答