如何从Python传递变量实际值到Shell脚本?
解决Python向Shell脚本传递变量值的问题
你的问题核心是传递了变量名的字面量,而非变量的实际值,同时subprocess的调用还有语法错误。下面一步步帮你修正:
先梳理你代码里的几个问题
- 你把
'Object_Id'和'Class_Name'作为字符串传给脚本,所以脚本接收到的就是这些字面量,不是变量存储的实际值 subprocess.check_output的参数列表里,'./execute.sh,存在语法错误(引号内多了个逗号),而且shell=True被错误地放在了命令参数列表里——它应该是函数的关键字参数,不属于命令本身- 你的
Object_Id是整数类型,传递给Shell脚本时需要先转成字符串类型
推荐的安全解决方案(无注入风险)
这种方式不使用shell=True,直接把命令和参数拆分成列表传递,是subprocess官方推荐的安全写法:
import subprocess Object_Id = 12 Class_Name = 'My_Class' Folder_Path = '/My_Folder' # 把变量的实际值作为列表元素传递,整数要转成字符串 output = subprocess.check_output(['./execute.sh', str(Object_Id), Class_Name]) # 将字节流输出解码为可读的字符串 print(output.decode('utf-8'))
你的execute.sh不需要修改,运行后会输出:
12 My_Class
另一种写法(使用shell=True,注意安全风险)
如果你一定要用shell=True,可以把命令拼接成一个字符串,直接把变量值嵌入进去:
import subprocess Object_Id = 12 Class_Name = 'My_Class' Folder_Path = '/My_Folder' # 用f-string把变量值拼接到命令字符串中 output = subprocess.check_output(f'./execute.sh {Object_Id} {Class_Name}', shell=True) print(output.decode('utf-8'))
⚠️ 注意:这种写法如果变量值来自不可信输入(比如用户提交的内容),可能会引发Shell注入攻击,所以尽量优先使用第一种方式。
为什么原来的代码不行?
你原来的代码相当于在Shell里直接敲./execute.sh Object_Id Class_Name,脚本自然会输出这两个字面量字符串,而不是你Python变量里存储的12和My_Class。
内容的提问来源于stack exchange,提问作者Subrata Fouzdar
相关产品推荐
相关产品推荐

