如何在Python中向subprocess传递多个嵌套列表执行终端命令
如何正确组合嵌套列表并通过subprocess执行终端命令?
问题描述
我编写了如下Python代码:
from pathlib import Path var_b='en' var_c='cs' var_d='false' var_e=str(Path.home()) IDS='TEST_123' L1 = [1, 2 , 3, 4] L2 = ['env', L1, f'a={var_b}'] CMD = ['COMMAND'] L3 = [IDS] L4 = [f'--b {var_b}', f'--c {var_c}'] L5 = [f'--d {var_d}', f'--e {var_e}.xml', L4]
我希望通过subprocess执行终端命令,最终执行的命令为:
env 1 2 3 4 a=en COMMAND TEST_123 --d false --e /path/to/home.xml --b en --c cs
尝试了以下代码:
import subprocess subprocess.run([*L2, *CMD, *L3, *L5])
但出现错误:
TypeError: expected str, bytes or os.PathLike object, not list
解决方案
错误原因
你的列表中存在嵌套结构:L2包含子列表L1,L5包含子列表L4。而subprocess.run()要求传入的参数列表必须是完全扁平的,每个元素必须是字符串(或路径对象),不能包含子列表,这就是报错的核心原因。此外,L1中的整数也需要转为字符串才能被subprocess识别。
方法1:修改列表定义,直接避免嵌套(推荐)
在定义列表时,用解包操作*直接展开嵌套的子列表,同时将整数转为字符串:
from pathlib import Path import subprocess var_b='en' var_c='cs' var_d='false' var_e=str(Path.home()) IDS='TEST_123' L1 = [1, 2 , 3, 4] # 直接展开L1到L2,同时将整数转为字符串 L2 = ['env', *map(str, L1), f'a={var_b}'] CMD = ['COMMAND'] L3 = [IDS] L4 = [f'--b {var_b}', f'--c {var_c}'] # 直接展开L4到L5 L5 = [f'--d {var_d}', f'--e {var_e}.xml', *L4] # 现在所有列表都是扁平的,直接拼接即可 subprocess.run([*L2, *CMD, *L3, *L5])
方法2:编写工具函数展开嵌套列表(适合无法修改原始列表的场景)
如果列表是动态生成的,无法直接修改定义,可以写一个递归函数来展开所有嵌套列表,并将非字符串元素转为字符串:
from pathlib import Path import subprocess def flatten_nested_list(nested_list): flat_list = [] for item in nested_list: if isinstance(item, list): # 递归展开子列表 flat_list.extend(flatten_nested_list(item)) else: # 将非字符串元素转为字符串 flat_list.append(str(item)) return flat_list # 原始代码部分(无需修改) var_b='en' var_c='cs' var_d='false' var_e=str(Path.home()) IDS='TEST_123' L1 = [1, 2 , 3, 4] L2 = ['env', L1, f'a={var_b}'] CMD = ['COMMAND'] L3 = [IDS] L4 = [f'--b {var_b}', f'--c {var_c}'] L5 = [f'--d {var_d}', f'--e {var_e}.xml', L4] # 合并所有列表并展开 full_command = flatten_nested_list([L2, CMD, L3, L5]) subprocess.run(full_command)
内容的提问来源于stack exchange,提问作者ranjith
相关产品推荐
相关产品推荐

