使我的 Python 脚本与“xargs”一起工作的过程是什么?例如,我希望以下命令遍历文本文件的每一行,并执行任意命令:
cat servers.txt | ./hardware.py -m
本质上希望每一行都传递给 hardware.py 脚本。
要使您的命令与您一起工作,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
你混淆了两个问题。
首先,您的应用程序可以接收来自标准输入的输入。这与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
.
目前还不太清楚你想做什么。如果./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