2

PHP程序运行Python脚本

 2 years ago
source link: https://blog.51cto.com/u_15773567/5655625
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

PHP程序运行Python脚本

精选 原创

小二上酒8 2022-09-06 14:15:29 ©著作权

文章标签 php python json 文章分类 Java 编程语言 阅读数210

介绍一下,如何在php程序中运行Python脚本,

在php中python程序的运行,主要依靠 程序执行函数,

这里说一下三个相关函数: ​​exec()​​ , ​​system()​​ 和  ​​passthru()​​ 。

这里主要讲  ​​exec()​​ 函数,介绍使用该函数传递参数,

以及如何使用python返回josn数据供php使用。

一、exec() — 执行一个外部程序

exec ( string $command [, array &$output [, int &$return_var ]] ) : string

参数说明 :

command:要执行的命令,其中包括三个子串,第一个子串为使用的当前系统的解释器,第二个子串为所要执行脚本的位置,第三个子串为所需传入的参数不限个数,中间用空格分隔,注意格式。子串间使用空格分割。

output:如果提供了 output 参数,那么会用命令执行的输出填充此数组,每行输出填充数组中的一个元素。(说明:output 中存放的并非python中return的值,并且所有return的值都不会进行保存,output 中存放的是python脚本中输出的值,即为 ​​print()​​ 函数所输出的所有数据)

return_var:如果同时提供 output 和 return_var 参数,命令执行后的返回状态会被写入到此变量。

1、直接运行

index.php

<?php

$re = exec('python ceshi.py', $out);

// $re = iconv('gbk', 'utf-8', $re);

var_dump($out);

echo '<br/>';

var_dump($re);

 ​ceshi.py​

def send():

data = '1,2,3,4,5'

print(data)

if __name__ == '__main__':

send()

(重要说明:如果Python脚本返回的数据中含有中文,需要使用  ​​iconv('gbk', 'utf-8', $re);​​ 进行转义)

PHP程序运行Python脚本_json

2、传参,接收返回数据

inde.php

$canshu1 = '这是PHP传过来的参数';

$canshu2 = date('Y-m-d');

$re = exec("python ceshi.py $canshu1 $canshu2");

$re = iconv('gbk', 'utf-8', $re);

var_dump($re);

 ​test.py​

import sys

def send():

# a1 = sys.argv[1]

# a2 = sys.argv[2]

re = sys.argv[1:]

data = '1,2,3,4,5,' + ','.join(re) # 转字符串

print(data)

if __name__ == '__main__':

send()

导入sys包,使用sys.argv[]数组获取传入参数,第一个传入参数为sys.argv[1],第二个为sys.argv[2]以此类推,不要使用argv[0]

PHP程序运行Python脚本_php_02

接收返回 json 数据:

import sys

import json

def send():

dict = {'id':111, 'title':'测试title'}

dict['data'] = sys.argv[1:]

jsonArr = json.dumps(dict, ensure_ascii=False)

print(jsonArr)

if __name__ == '__main__':

send()

(涉及到中文字符的时候,需要指定ensure_ascii=False)

PHP程序运行Python脚本_php_03

二、system() — 执行外部程序,并且显示输出

system ( string $command [, int &$return_var ] ) : string

同 C 版本的 ​​system()​​ 函数一样,本函数执行 command 参数所指定的命令,并且输出执行结果。

如果 PHP 运行在服务器模块中,  ​​system()​​ 函数还会尝试在每行输出完毕之后,自动刷新 web 服务器的输出缓存。

如果要获取一个命令未经任何处理的 原始输出,请使用  ​​passthru()​​ 函数。

index.php

<?php

echo '这是运行直接输出:';

$re = system('python ceshi.py');

// $re = iconv('gbk', 'utf-8', $re);

echo '<br/>';

echo '这是赋值输出:';

var_dump($re);

这里使用最初版本的 ​ ​test.py​​,输出效果如下:

PHP程序运行Python脚本_json_04

三、passthru() — 执行外部程序,并且显示输出

passthru ( string $command [, int &$return_var ] ) : void

同 ​​exec()​​ 函数类似,  ​​passthru()​​ 函数 也是用来执行外部命令(command)的。当所执行的 Unix 命令输出二进制数据,并且需要直接传送到浏览器的时候,需要用此函数来替代 exec() 或 system() 函数。常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。通过设置 Content-type 为 image/gif,然后调用 pbmplus 程序输出 gif 文件,就可以从 PHP 脚本中直接输出图像到浏览器。

index.php

echo '这是运行直接输出:';

$re = passthru('python ceshi.py');

// $re = iconv('gbk', 'utf-8', $re);

echo '<br/>';

echo '这是赋值输出:';

var_dump($re);

这里使用最初版本的 ​ ​test.py​​,输出效果如下:

PHP程序运行Python脚本_php_05


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK