在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
投稿

猜你喜欢

  • python re.match函数的具体使用

    2023-07-31 13:16:28
  • wiondws XP下安装MySQL图文教程

    2007-06-15 09:29:00
  • 快速掌握怎样选择准备安装的 MySQL版本

    2008-12-17 16:42:00
  • Oracle Session每日统计功能实现

    2023-07-22 09:47:24
  • pandas 像SQL一样使用WHERE IN查询条件说明

    2023-07-01 23:26:37
  • 网站如何使用黄金分割布局

    2010-11-05 18:34:00
  • IIS上设置301跳转,实现ASP带参数跳转

    2011-04-08 12:52:00
  • java连接mysql数据库 java连接sql server数据库

    2023-07-16 06:56:50
  • 显示你个性的鼠标指针

    2011-06-14 09:41:41
  • 一个20行左右的强$代码

    2009-12-25 15:22:00
  • sql不常用函数总结以及事务,增加,删除触发器

    2012-07-11 16:03:42
  • 高性能网站建设指南:性能提升的14个原则

    2011-07-14 16:04:54
  • asp如何在线更改密码?

    2010-06-26 12:22:00
  • 网址站的2.0玩法

    2010-03-15 12:25:00
  • java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input

    2010-07-16 13:23:00
  • 科讯CMS 5.0 模板标签清单列表

    2008-12-04 13:18:00
  • Go语言题解LeetCode35搜索插入位置示例详解

    2023-07-16 17:17:00
  • 用XML和XSL来生成动态页面

    2008-09-04 10:35:00
  • php实现的单一入口应用程序实例分析

    2023-11-22 08:00:26
  • js实现网页加载loading的显示

    2007-11-06 12:11:00
  • asp之家 网络编程 m.aspxhome.com