我有一个 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_MAX
Linux 上命令行的总大小加上一些其他内容的总大小)。该xargs
程序是针对这种情况而设计的,如果命令行对于程序的单次运行来说太长,它会将其拆分为不同的运行。如果这有帮助,您可以这样做:
files.py | xargs cmd.py
当然,这也有潜在的问题,因为它期望包含有问题字符的文件名被引用/转义,就像直接在 shell 中输入它们的名称时一样。一种选择是进行更改,cmd.py
以便正确引用输出,但是xargs
可以使某些版本接受换行符分隔的文件名,类似于IFS
上面的设置。如果-d
支持该选项(这是xargs
Linux 上的 GNU):
files.py | xargs -d '\n' cmd.py
最后,也许最好的方法(现在大多数xargs
实现都支持)是可以用空值而不是换行符分隔输入文件。这将很容易处理任何文件名而不引入复杂的引用,因为 null 是 Unix 文件名中唯一不允许的字符:
files.py | xargs -0 cmd.py