在PHP程序中运行Python脚本(接收数据及传参)的方法详解

作者:PHP开源社区 时间:2023-11-24 10:14:48 

介绍一下,如何在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脚本(接收数据及传参)的方法详解

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脚本(接收数据及传参)的方法详解

接收返回 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脚本(接收数据及传参)的方法详解

二、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脚本(接收数据及传参)的方法详解

三、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脚本(接收数据及传参)的方法详解

来源:https://mp.weixin.qq.com/s/b463lhAKIym2C3iC4gUWnQ

标签:PHP,运行,Python
0
投稿

猜你喜欢

  • 浅谈为什么#{}可以防止SQL注入

    2024-01-27 07:19:08
  • Go 高效截取字符串的一些思考

    2024-04-30 10:04:43
  • ORACLE常见错误代码的分析与解决(三)

    2010-07-31 12:45:00
  • Perl实现的Linux下socket代理服务器

    2023-04-28 10:57:41
  • VS2019连接mysql8.0数据库的教程图文详解

    2024-01-13 12:54:26
  • python机器人行走步数问题的解决

    2023-12-24 23:26:05
  • python使用reportlab画图示例(含中文汉字)

    2022-10-22 17:14:18
  • Python venv虚拟环境跨设备迁移的实现

    2022-02-01 07:10:55
  • 关于base64编码的原理及实现方法分享

    2023-08-31 07:34:40
  • Python 语句的表达式和缩进

    2023-11-26 18:28:24
  • Python实现随机创建电话号码的方法示例

    2021-08-31 06:38:03
  • MAC 中mysql密码忘记解决办法

    2024-01-18 04:13:48
  • SQL Server新特性SequenceNumber用法介绍

    2024-01-15 02:38:34
  • Pytorch可视化的几种实现方法

    2023-06-11 17:44:57
  • Date对象格式化方法

    2009-11-16 13:17:00
  • python错误提示:Errno 2] No such file or directory的解决方法

    2022-03-30 10:46:26
  • python实现基于SVM手写数字识别功能

    2021-10-03 12:33:41
  • 避坑:Sql中 in 和not in中有null值的情况说明

    2024-01-22 17:01:33
  • Python的Django框架中TEMPLATES项的设置教程

    2022-09-23 03:16:09
  • Python Opencv中基础的知识点

    2023-06-08 21:10:48
  • asp之家 网络编程 m.aspxhome.com