【问题标题】:executing Python script in PHP and exchanging data between the two在 PHP 中执行 Python 脚本并在两者之间交换数据
【发布时间】:2012-12-12 10:45:01
【问题描述】:

是否可以在 PHP 中运行 Python 脚本并相互传输变量?

我有一门课程以某种全局方式从网站上抓取数据。我想让它变得更具体,并且已经有针对多个网站的 python 脚本。

我正在寻找一种方法将这些内容融入我的课堂。

两者之间是否有可能进行安全可靠的数据传输?如果是这样,要实现这样的目标有多难?

【问题讨论】:

  • 可以使用命令行 (cli) exec() 等来完成
  • 感谢大家的帮助

标签: php python


【解决方案1】:

您通常可以使用通用语言格式在语言之间进行通信,并使用stdinstdout 进行数据通信。

使用 shell 参数通过 JSON 发送初始数据的 PHP/Python 示例

PHP:

// This is the data you want to pass to Python
$data = array('as', 'df', 'gh');

// Execute the python script with the JSON data
$result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data)));

// Decode the result
$resultData = json_decode($result, true);

// This will contain: array('status' => 'Yes!')
var_dump($resultData);

Python:

import sys, json

# Load the data that PHP sent us
try:
    data = json.loads(sys.argv[1])
except:
    print "ERROR"
    sys.exit(1)

# Generate some data to send to PHP
result = {'status': 'Yes!'}

# Send it to stdout (to PHP)
print json.dumps(result)

【讨论】:

  • 你的 php 例子看起来很简单
  • 没什么难的,不!只要你坚持使用标准数据结构(字符串、整数、数组、字典、布尔值、浮点数),这种方法就可以让你传递任何你需要的东西。
  • 它应该在哪里 script.py?我在 php 页面中得到了 null!
  • 能否请您举个例子从python发送数据到php?
  • 如果您遇到从 python 脚本返回的 NULL,这可能意味着 escapeshellarg() 正在从编码的 JSON 中取出双引号,使其呈现无效 JSON,从而导致 json.loads()失败。尝试在 php 中使用 base64_encode(); 而不是 escapeshellarg(); 在 python 中使用 import base64/base64.b64decode()。另外,如果路径包含空格'python "path/that/has spaces/script.py" ',请不要忘记用双引号括起来,就像我的情况一样。干杯! :)
【解决方案2】:

您正在寻找“进程间通信”(IPC) - 您可以使用 XML-RPC 之类的东西,它基本上可以让您在远程进程中调用一个函数,并处理语言之间所有参数数据类型的翻译(所以你可以从 Python 调用 PHP 函数,反之亦然 - 只要参数是 a supported type)

Python 有一个内置的XML-RPC server 和一个client

phpxmlrpc 库既有客户端也有服务器

Python server and clientPHP clientserver 都有示例

【讨论】:

  • 非常感谢您的帮助
【解决方案3】:

刚遇到同样的问题,想分享我的解决方案。 (严格遵循 Amadan 的建议)

蟒蛇片

import subprocess

output = subprocess.check_output(["php", path-to-my-php-script, input1])

你也可以这样做:blah = input1 而不是仅仅提交一个未命名的参数...然后使用 $_GET['blah']。

php 片断

$blah = $argv[1];



if( isset($blah)){

    // do stuff with $blah

}else{
    throw new \Exception('No blah.');
}

【讨论】:

    【解决方案4】:

    最好的办法是将 python 作为子进程运行并捕获其输出,然后对其进行解析。

    $pythonoutput = `/usr/bin/env python pythoncode.py`;
    

    使用 JSON 可能有助于简化两种语言的生成和解析,因为它是标准的并且两种语言都支持它(嗯,至少非古代版本支持)。在 Python 中,

    json.dumps(stuff)
    

    然后在 PHP 中

    $stuff = json_decode($pythonoutput);
    

    您还可以将数据显式保存为文件,或使用套接字,或者根据您需要的确切场景,使用多种不同的方法来提高效率(也更复杂),但这是最简单的。

    【讨论】:

      【解决方案5】:

      对我来说,escapeshellarg(json_encode($data)) 给出的并不是一个 json 格式的字符串,而是像 { name : Carl , age : 23 } 这样的字符串。 所以在 python 中,我需要.replace(' ', '"') 空格来获得一些真正的 json 并能够在其上投射json.loads(sys.argv[1])

      问题是,当有人输入一个已经包含空格的名称时,例如“Ca rl”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2012-11-03
        • 2017-09-01
        相关资源
        最近更新 更多