如何向Python中执行的PHP代码传递参数?
解决Python向执行的PHP代码传递参数的问题
方法一:修正字符串拼接(适用于简单参数场景)
原代码的问题在于字符串拼接时错误使用了{val},Python中直接用变量名拼接即可。同时要注意如果参数包含单引号,需要先转义,避免破坏PHP的字符串语法。
修改后的代码:
import subprocess def php(code): p = subprocess.Popen(["php","-r", code], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out = p.communicate() #returns a tuple (stdoutdata, stderrdata) if out[1] != b'': raise Exception(out[1].decode('UTF-8')) return out[0].decode('UTF-8') val = str(1234) # 转义单引号,避免PHP语法错误 escaped_val = val.replace("'", "\\'") code = """ \ function my_encoder($in){ $out = base_convert($in,16,36); return $out; } print(my_encoder('"""+escaped_val+"""')); """ print(php(code))
方法二:通过命令行参数传递(更安全,推荐)
直接拼接字符串存在注入风险,尤其是参数包含特殊字符时。更安全的方式是通过命令行参数传递,PHP可以通过$argv获取这些参数。
修改后的代码:
import subprocess def php_with_args(code, args=None): cmd = ["php", "-r", code] if args: cmd.extend(args) p = subprocess.Popen(cmd, 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 = str(1234) # PHP代码中通过$argv[1]获取第一个命令行参数 code = """ \ function my_encoder($in){ $out = base_convert($in,16,36); return $out; } // $argv[0]是php本身,$argv[1]是传入的第一个参数 print(my_encoder($argv[1])); """ print(php_with_args(code, args=[val]))
这种方式不需要处理字符串转义,也避免了潜在的代码注入问题,适合大多数场景。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

