【问题标题】:Python script calling PHP script while passing $_GET parametersPython 脚本在传递 $_GET 参数时调用 PHP 脚本
【发布时间】:2014-07-17 00:54:17
【问题描述】:

我目前在我的 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'];
?>

【问题讨论】:

  • 您是在 apache 还是 fpm 下提供这个 php 脚本?为什么不使用请求docs.python-requests.org/en/latest
  • 不,你不能这样做。您需要编辑 php 脚本并让它解析 $argv

标签: php python


【解决方案1】:

使用您的 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);
}

最后按照 user574632 的建议,您可以使用以下 if 语句包装此代码,以确保在您仍将其作为 Web 脚本运行时它不会干扰。

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

【讨论】:

  • 手动填充 GET 表明该脚本已经适用于 get vars,因此可能在命令和 Web 中使用,在这种情况下,可能需要对 PHP_SAPI == 'cli' 进行条件检查
  • 所以我尝试了subprocess.call(["php", "-f", "test.php", "1234", "3", "s"])至于我的 php 脚本,它看起来像这样:echo var_dump($argv) 我得到了NULL 我什至尝试使用 foreach 循环来打印所有值,我'我没有得到任何回报
  • 一次采取这一步 - 首先从命令行手动调用php -f test.php 1234 3 s
  • 所以我单独在命令行中调用了php -f test.php 1234 3 s,我得到了相同的结果:NULLcount()0 php code results
  • 把文件开头贴到你var_dump的部分
【解决方案2】:

你不会这样称呼它,更像这样:

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

其中 1 是参数的值。然后,在您的脚本中:

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

这会给你带来价值。我的 python 有点生锈了,但这是基础。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2015-05-13
    • 2017-10-05
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多