使Python脚本与xargs一起使用

时间:2012-08-07 19:58:48

标签: python xargs

使用'xargs'让我的Python脚本运行良好的过程是什么?例如,我希望以下命令处理每行文本文件,并执行任意命令:

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你混淆了两个问题。

首先,您的应用程序可以从stdin接收输入。这与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处理命令行通常会更好。

答案 2 :(得分: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