使用GNU-P的Python管道

2024-10-03 15:34:24 发布

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

我试图用Python编写一个gnupallel包装器来并行运行一个命令,但似乎误解了gnupalleloper的工作原理、系统管道和/或Python子进程管道。在

实际上,我希望使用gnupallell来处理拆分输入文件,然后在多个主机上并行运行另一个命令。在

我可以在将来研究一些纯python方法来实现这一点,但似乎应该很容易使用GNU Parallel实现它。在

t.py

#!/usr/bin/env python

import sys

print
print sys.stdin.read()
print

p.py

^{pr2}$

调用1和调用2生成相同的输出,而调用3生成我预期的输出,即输入文件被拆分并包含记录之间的空行。在

我更想知道电话1、2和3之间的区别。在


Tags: 文件方法pygnu命令管道进程系统
1条回答
网友
1楼 · 发布于 2024-10-03 15:34:24

TL;DRshell=False时不要引用">"。在

如果使用shell=True,则可以使用shell的所有功能,如globbing、I/O重定向等。您需要引用任何需要从shell转义的内容。您可以将整个命令行作为单个字符串传递,shell将解析它。在

unsafe = subprocess.Popen('echo `date` "my files" * >output', shell=True)

使用shell=False,您在幕后没有“秘密”的副作用,而且shell的任何工具都不可用。因此,您需要在Python端处理globbing、重定向等。从好的方面来说,你节省了一个(潜在的)额外的过程,你有了更多的控制权,你不需要(事实上也不应该)引用那些在涉及shell时必须引用的东西。总之,这也更安全,因为你可以看到你正在做什么。在

^{pr2}$

(这仍然略有不同,因为在现代shell中,echo是一个内置的,而现在,我们将执行一个外部实用程序/bin/echo,或者在PATH中以该名称出现的任何可执行文件)

现在,回到您的示例,args中的问题是您引用了一个文本">"作为记录分隔符。当涉及到一个shell时,未加引号的right brocket将调用重定向,因此要将其指定为字符串,必须对其进行转义或引用;但是当图片中没有shell时,就没有任何东西可以处理(或需要)这些引号,所以要传递一个literal >参数,只需按字面意思传递。在

有了这一点,你的电话ţ1显然是一个好办法。(尽管我并不完全相信为用Perl实现的shell命令编写Python包装器是明智的。我怀疑直接在Python中处理一堆并行子进程不会更复杂。)

相关问题 更多 >