
本文介绍如何在 python 中通过 subprocess 调用 php 解释器,并将 python 变量安全注入 php 代码中作为函数参数,重点解决字符串拼接导致的语法错误与安全风险问题。
在 Python 中调用 PHP 执行动态代码时,常需将 Python 变量(如字符串、数字)传入 PHP 函数作为参数。上述代码意图是将 Python 变量 val = "1234" 传给 PHP 函数 my_encoder(),但原始写法中误用了 {val}(类似 f-string 的占位符),而实际使用的是普通三重引号字符串拼接,导致语法错误。
✅ 正确做法是:直接拼接字符串,不加花括号,并注意引号嵌套与转义:
import subprocess
def php(code):
p = subprocess.Popen(["php", "-r", code],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out = p.communicate()
if out[1] != b'':
raise Exception(out[1].decode('UTF-8'))
return out[0].decode('UTF-8')
val = "1234" # 注意:此处应为字符串,因 base_convert 期望字符串输入
code = """\
function my_encoder($in){
return base_convert($in, 16, 36);
}
print(my_encoder('""" + val + """'));
"""
print(php(code)) # 输出示例:'10000000000'⚠️ 关键注意事项:
- 避免使用 {val} 拼接:{val} 仅在 f-string(如 f"...")中有效;普通字符串中它只是字面量 { 和 },会导致 PHP 语法错误或 Python 报 SyntaxError。
- 引号嵌套要严谨:PHP 代码中用单引号包裹参数('1234'),因此 Python 字符串拼接时需确保外部用双引号或三重双引号,内部单引号不冲突。
- 防范代码注入风险:当前方式直接拼接用户可控输入存在严重安全隐患(如 val = "1234'); echo 'pwned'; //" 将破坏逻辑)。生产环境应改用更安全的方式,例如:
? 进阶推荐(安全版,基于 stdin):
立即学习“PHP免费学习笔记(深入)”;
def php_with_input(code, input_data):
p = subprocess.Popen(["php", "-r", code],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True)
out, err = p.communicate(input=input_data)
if err:
raise Exception(err)
return out.strip()
val = "1234"
code = """$input = trim(file_get_contents('php://stdin'));
echo base_convert($input, 16, 36);"""
print(php_with_input(code, val))综上,参数传递的核心在于明确字符串拼接机制、规避语法陷阱、并始终优先考虑安全性。简单场景可用字符串拼接,但涉及用户输入时,务必升级为 stdin 或临时文件等隔离方案。











