Python循环调用subprocess脚本时如何传递循环变量参数
解决方法
方法1:通过命令行参数传递(最常用)
主脚本修改方式
直接把变量x作为命令行参数拼接在调用命令后,推荐用列表形式传参避免shell注入风险,示例代码:
import subprocess for x in range(1, 11): x_str = str(x) # 调用foo.py p = subprocess.Popen(['python', 'foo.py', x_str], shell=False) out, err = p.communicate() # 调用bar.py p = subprocess.Popen(['python', 'bar.py', x_str], shell=False) out, err = p.communicate() # 调用bas.py p = subprocess.Popen(['python', 'bas.py', x_str], shell=False) out, err = p.communicate()
如果你坚持要用shell=True的写法,用f字符串拼接即可:cmd = f'python foo.py {x}'
被调用脚本(以foo.py为例)接收方式
用sys模块的argv列表接收参数,argv[0]是脚本自身名称,argv[1]就是传入的第一个参数:
import sys # 注意传入的参数默认是字符串类型,需要按需转换类型 if len(sys.argv) < 2: print("缺少参数x") sys.exit(1) x = int(sys.argv[1]) # 后续正常使用x变量即可
bar.py和bas.py的接收方式和foo.py完全一致。
方法2:通过环境变量传递
如果需要传递的变量较多,也可以通过环境变量传值:
主脚本修改方式
import subprocess import os for x in range(1, 11): # 复制当前系统环境变量,新增自定义变量 custom_env = os.environ.copy() custom_env['MY_X_VAR'] = str(x) # 调用时传入自定义环境变量 p = subprocess.Popen(['python', 'foo.py'], shell=False, env=custom_env) out, err = p.communicate() # 其余两个脚本调用逻辑同上,替换脚本名即可
被调用脚本接收方式
import os x_str = os.environ.get('MY_X_VAR') if not x_str: print("未读取到环境变量MY_X_VAR") exit(1) x = int(x_str) # 后续使用x即可
注意事项
- 所有通过命令行/环境变量传递的参数默认都是字符串类型,接收后需要根据业务需求转换为int、float等对应类型
- 推荐优先使用
shell=False的列表传参方式,避免参数中存在特殊字符时解析出错,也能规避shell注入的安全风险
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

