是否可以在 PHP 中运行 Python 脚本并相互传输变量?
我有一门课,它以某种全球方式从网站上删除数据。我想让它变得更具体,并且已经有针对多个网站的 python 脚本。
我正在寻找一种方法将这些内容纳入我的课堂。
两者之间是否有可能进行安全可靠的数据传输?如果是这样,让这样的事情发生有多困难?
您通常可以通过使用通用语言格式以及使用stdin
和stdout
来传达数据来进行语言之间的交流。
使用 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)
您正在寻找“进程间通信”(IPC) - 您可以使用 XML-RPC 之类的东西,它基本上可以让您在远程进程中调用一个函数,并处理语言之间所有参数数据类型的翻译(这样您就可以从 Python 调用 PHP 函数,反之亦然 - 只要参数是受支持的类型)
Python 有一个内置的XML-RPC 服务器和一个客户端
phpxmlrpc库既有客户端也有服务器
刚遇到同样的问题,想分享我的解决方案。(密切遵循 Amadan 的建议)
import subprocess
output = subprocess.check_output(["php", path-to-my-php-script, input1])
你也可以这样做:blah = input1 而不是仅仅提交一个未命名的参数......然后使用 $_GET['blah'].
$blah = $argv[1];
if( isset($blah)){
// do stuff with $blah
}else{
throw new \Exception('No blah.');
}
最好的办法是将 python 作为子进程运行并捕获其输出,然后对其进行解析。
$pythonoutput = `/usr/bin/env python pythoncode.py`;
使用 JSON 可能有助于简化两种语言的生成和解析,因为它是标准的并且两种语言都支持它(嗯,至少非古代版本支持)。在 Python 中,
json.dumps(stuff)
然后在 PHP
$stuff = json_decode($pythonoutput);
您还可以根据您需要的确切场景将数据显式保存为文件,或使用套接字,或者有许多不同的方法来提高效率(也更复杂),但这是最简单的。
对我来说,escapeshellarg(json_encode($data))
给出的不是一个 json 格式的字符串,而是像 { name : Carl , age : 23 } 这样的东西。所以在python中我需要.replace(' ', '"')
空格来获得一些真正的json并能够对其进行转换json.loads(sys.argv[1])
。
问题是,当有人输入一个已经有空格的名字时,比如“Ca rl”。