Python通过subprocess调用脚本时如何传递并接收参数?
解决方法:子进程参数接收与并行调用修正
一、修正s.py的并行逻辑
你的s.py存在几处问题需要调整:
processToParallelize未接收pool.map传递的参数,且变量l未定义text=true需改为text=True(Python大小写敏感)python_path替换为实际Python解释器路径(如"python"或"python3")
假设每个并行任务对应独立的l值,修正后的s.py示例:
import multiprocessing as mp import subprocess def processToParallelize(l): # 每个进程内的l值固定,调用子进程时传递该值 subprocess.call(["python", "./子文件夹路径/o.py"], input=str(l), text=True) if __name__ == '__main__': NUMBER_OF_TASKS = 2 # 示例:4个不同的l值,对应4个并行任务 l_values = [10, 20, 30, 40] pool = mp.Pool(NUMBER_OF_TASKS) pool.map(processToParallelize, l_values) pool.close() pool.join()
二、o.py接收参数的两种方式
方式1:读取标准输入(对应subprocess的input参数)
你通过subprocess.call的input参数传递的l会进入子进程的标准输入,o.py可通过sys.stdin读取:
import sys # 读取输入并去除首尾空白(如换行符) r = sys.stdin.read().strip() # 若l是数值类型,需做类型转换:r = int(sys.stdin.read().strip()) def someoperation(r_val): # 示例业务操作 return r_val * 2 x = someoperation(r)
方式2:通过命令行参数传递(更直观)
若改用命令行传参,s.py的调用代码调整为:
subprocess.call(["python", "./子文件夹路径/o.py", str(l)])
o.py通过sys.argv接收参数:
import sys # sys.argv[0]是脚本名,sys.argv[1]为传入的第一个参数 r = sys.argv[1] # 数值类型转换:r = int(sys.argv[1]) def someoperation(r_val): return r_val * 2 x = someoperation(r)
三、关于l值不变的说明
每个mp.Pool启动的进程会拿到独立的l值(来自l_values列表),在该进程生命周期内l不会被修改;而每个subprocess启动的子进程仅接收一次传递的l值,运行过程中该值始终固定,完全符合需求。
内容的提问来源于stack exchange,提问作者ArbitraryConstant
相关产品推荐
相关产品推荐

