Python脚本调用PHP脚本并传递$_GET参数

5 投票
2 回答
5923 浏览
提问于 2025-04-18 07:45

我现在在我的Python脚本中使用 subprocess.call(["php", "test.php"]) 来调用一个PHP脚本。

我想知道在调用这个脚本的时候,是否可以传递 $_GET 参数。如果可以的话,我该怎么做呢?

我想要实现的是这样的效果:
"subprocess.call(["php", "test.php?i=3"])"


这是我现在的代码:
test.py

import subprocess
subprocess.call(["php", "test.php"])


test.php

<?php
    echo $_GET['i'];
?>

2 个回答

2

你不会这样调用它,而是应该这样:

subprocess.call(["php","-f","test.php","1"])

这里的1是你传递的参数值。然后,在你的脚本中:

<?php
echo $argv[0];
?>

这样你就能得到这个值了。我的Python有点生疏,但这就是基本的用法。

3

试试下面这个Python代码,你可以传入任意数量的参数。

subprocess.call(["php","-f","test.php","param0:value0", "param1:value1"])

现在来看PHP的部分:

<?php
$_GET = array();

foreach($argv as $key => $pair) {
    if ($key == 0) { //skip first element which is script name (test.php)
        continue;
    }

    list($key, $value) = explode(":", $pair);
    $_GET[$key] = $value;
}

这个代码手动解析了 $argv,并为你填充了 $_GET,这样你只需要修改PHP文件的开头部分。

不过,这个方法并不完美,因为如果你的键或值中包含和 : 一样的字符,就会出问题。更好的方法是通过一个JSON字符串来传递参数。比如:

subprocess.call(["php","-f","test.php", json.dumps(your_dictionary)])

然后在PHP中:

<?php
if ($argc > 1) {
  $json_str = $argv[1];
  $_GET = json_decode($json_str);
}

最后,正如用户574632所建议的,你可以用下面的 if 语句把这段代码包裹起来,这样即使你还在运行它作为网页脚本,也不会产生干扰。

if (php_sapi_name() == 'cli') {
  //execute in here *only* if run from the command-line
}

撰写回答