使Python脚本与xargs一起工作

2024-06-28 16:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: py命令txt脚本过程hardwarecat文本文件
3条回答

你混淆了两个问题。

首先,您的应用程序可以接收来自stdin的输入。这与xargs无关。在您的示例中,只需将hardware.py读取为输入文件,例如:

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

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

其次,应用程序可以从参数接收输入。在这里您可以使用xargs。例如:

xargs./hardware.py<;servers.txt与cat servers.txt相同

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

Python在sys.arvg数组中存储命令行参数。sys.argv[0]将是命令名,sys.argv[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

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

相关问题 更多 >