29

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

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

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

两者之间是否有可能进行安全可靠的数据传输?如果是这样,让这样的事情发生有多困难?

4

5 回答 5

71

您通常可以通过使用通用语言格式以及使用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)
于 2012-12-27T00:41:10.627 回答
10

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

Python 有一个内置的XML-RPC 服务器和一个客户端

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

都有Python 服务器和客户端以及PHP 客户端服务器的示例

于 2012-12-27T01:22:27.837 回答
2

刚遇到同样的问题,想分享我的解决方案。(密切遵循 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.');
}
于 2013-08-28T17:08:35.297 回答
0

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

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

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

json.dumps(stuff)

然后在 PHP

$stuff = json_decode($pythonoutput);

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

于 2012-12-27T00:36:10.710 回答
0

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

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

于 2022-01-27T11:03:53.940 回答