使用'xargs'让我的Python脚本运行良好的过程是什么?例如,我希望以下命令处理每行文本文件,并执行任意命令:
cat servers.txt | ./hardware.py -m
基本上希望将每一行传递给hardware.py脚本。
答案 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