python 中的管道函数参数到命令行参数

python 中的管道函数参数到命令行参数

我有一个 python 代码(cmd.py),它接受文件作为命令行参数并使用 parse_args 进行处理。我想将文件从另一个代码 ( files.py) 传递到cmd.py,就像传递函数参数一样。
可以在不修改cmd.py的情况下完成此操作吗?

答案1

是的,可以这样做:

cmd.py `files.py`

然后首先执行 files.py,输出(示例:“file1.txt file2.txt”)是 cmd.py 的输入。

例子:

cat `ls`

这会“捕获” ls 在工作目录中找到的所有文件。

答案2

这里可以做几件事。首先是简单的命令替换:

cmd.py $(files.py)

这里的一个问题是,如果文件名中有任何空格、制表符或换行符,那么这些文件名将不会作为单个参数传递,而是会在出现这些字符的地方拆分为不同的参数。

一种替代方法是,如果cmd.py在单独的行上输出每个文件,您可以将 shell 设置IFS为仅包含换行符:

IFS='
'
cmd.py $(files.py)

这意味着只有包含换行符的文件名才是问题,从而减少了失败的情况。

另一个问题是如果有大量文件输出,会发生什么情况files.py。命令行可能会变得比系统可以处理的长度更长(限制因素是ARG_MAXLinux 上命令行的总大小加上一些其他内容的总大小)。该xargs程序是针对这种情况而设计的,如果命令行对于程序的单次运行来说太长,它会将其拆分为不同的运行。如果这有帮助,您可以这样做:

files.py | xargs cmd.py

当然,这也有潜在的问题,因为它期望包含有问题字符的文件名被引用/转义,就像直接在 shell 中输入它们的名称时一样。一种选择是进行更改,cmd.py以便正确引用输出,但是xargs可以使某些版本接受换行符分隔的文件名,类似于IFS上面的设置。如果-d支持该选项(这是xargsLinux 上的 GNU):

files.py | xargs -d '\n' cmd.py

最后,也许最好的方法(现在大多数xargs实现都支持)是可以用空值而不是换行符分隔输入文件。这将很容易处理任何文件名而不引入复杂的引用,因为 null 是 Unix 文件名中唯一不允许的字符:

files.py | xargs -0 cmd.py

相关内容