Python 从作为参数传递给函数的列表中填充bash命令

Python 从作为参数传递给函数的列表中填充bash命令,python,python-3.x,bash,Python,Python 3.x,Bash,我有一个作为参数传递给函数的列表。从这个列表中,我需要填充一个bash命令并执行它 lst = ['test01.gz','test02.gz','test03.gz','newtest01.gz','newtest02.gz','random.gz'] def populate_command(lst): cmd = 'cat {} {} > filename.gz' subprocess.run(cmd, shell=True, check=True) 这里,cat

我有一个作为参数传递给函数的列表。从这个列表中,我需要填充一个bash命令并执行它

lst = ['test01.gz','test02.gz','test03.gz','newtest01.gz','newtest02.gz','random.gz']

def populate_command(lst):
    cmd = 'cat {} {} > filename.gz'
    subprocess.run(cmd, shell=True, check=True)
这里,
cat
命令应填充
cat test01.gz test02.gz test03.gz>test.gz
。同样,对于
newtest01.gz
cat newtest01.gz newtest02.gz>newtest.gz
),如果只有一个
.gz
文件(
random.gz
),则不执行任何操作


我无法使用列表中的参数填充
cat
命令。 任何帮助都将不胜感激

==================================

编辑代码

提出了以下解决方案,但我想for循环太多了。还有其他有效的方法吗

我有一份文件清单
s3_文件列表=['test01.gz','test02.gz','test03.gz','newtest01.gz','newtest02.gz','random.gz']

从中我得到了文件名,这些文件被分割成多个文件,如test01、test02等

输入导入列表

def find_split_文件(临时列表)->list[str]:
main_lst=set()
对于临时列表中的x: 如果x[:-3][3:!='000': 主列表添加(x[:-6]) 返回主列表

split\u files=find\u split\u files(s3\u文件列表)

split_文件为我提供了['test','newtest']

def文件到zip(拆分文件、s3文件列表):
main_lst=[]
对于拆分文件中的y:
温度=[]
对于s3_文件列表中的x:
如果x.startswith(y):
临时附加(x)
主附加(临时附加)

Main_lst返回['test01.gz','test02.gz','test03.gz',['newtest01.gz','newtest02.gz']

def populate_命令(主_lst):
对于主回路中的p:
cmd='cat'
对于p中的f:
cmd=cmd+f+''
cmd=cmd+'>'+f[:-6]+'.gz'
打印(f'命令为{cmd}')

subprocess.run(cmd,shell=True,check=True)

您可以使用for语句迭代lst并构建cmd字符串,如图所示:

> def populate_command(lst):
>     cmd = 'cat '
>     for f in lst:
>         cmd = cmd + f + ' '
>     cmd = cmd + ' > filename.gz'
>     subprocess.run(cmd, shell=True, check=True)

“我无法使用列表中的参数填充cat命令”-您甚至还没有尝试过。需要考虑的一些问题:函数如何知道哪些文件名应该传递给
cat
命令?(例如,为什么不将所有内容都塞进
lst
中呢?)函数如何知道在哪里写入结果?如中所示,在
之后应该是什么文件名?解析该列表并不容易。如果您可以以
[['test01.gz'、'test02.gz'、'test03.gz'、['newtest01.gz'、'newtest02.gz']、['random.gz']
的形式获取数据(或者更好,类似于
[(['test01.gz'、'test02.gz'、'test03.gz']、'test.gz')、(['newtest01.gz]、'newtest02.gz']、'newtest02.gz')、(['random.gz'])、'random.gz')、None
),那么做你想做的事情就容易多了。让我们知道你是否能够在你的情况下做到这一点。这个问题似乎由两个问题组成。一次解决一个问题是一个很好的建议,到时候你也许可以自己解决。你真的不需要外壳<代码>打开(输出文件,'w')作为f:run(['cat']+infiles,stdout=f)。正如nog642所指出的,最困难的部分是适当地分割输入列表。您甚至可能不需要使用
子流程
;您可以在Python中打开输入文件并将其写入输出文件,而无需使用
cat