PHP程序运行Python脚本
PHP调用外部程序方法
PHP执行外部程序的方法
system(),system函数将执行的结果直接输出
exec():执行一个外部程序,将输出结果保存在第二个参数上
passthru():执行外部程序并且显示原始输出
shell_exec(),没有参数中接收返回值,而且没有执行成功的状态码
proc_open(),会fork一个子进程,返回文件指针,但可提供双向通道
escapeshellcmd():只是辅助作用
escapeshellarg():只是辅助作用
这些函数的使用前提:
- PHP没有运行在安全模式,关掉安全模式,即:
safe_mode = off
- 禁用函数列表
disable_functions = exec
,system, shell_exec
,proc_open
,popen
, 如果禁用了,就关掉。
注意:执行外部程序是存在风险的,所以使用这些函数要在确保安全的情况下使用。
exec
在php中python程序的运行,主要依靠 程序执行函数,这里说一下三个相关函数:exec()
,system()
和passthru()
。
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 参数,命令执行后的返回状态会被写入到此变量,0代表运行成功,非0代表失败。
PHP执行外部程序延伸:
system — 执行外部程序,并且显示输出
说明:
string system ( string $command [, int &$return_var ] )
同 C 版本的 system() 函数一样, 本函数执行 command 参数所指定的命令, 并且输出执行结果。
如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。
如果要获取一个命令未经任何处理的 原始输出, 请使用 passthru() 函数。
参数:
command
要执行的命令。
return_var
如果提供 return_var 参数, 则外部命令执行后的返回状态将会被设置到此变量中。
返回值:
成功则返回命令输出的最后一行, 失败则返回 FALSE
2、passthru — 执行外部程序并且显示原始输出
void passthru ( string $command [, int &$return_var ] )
同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
参数:
command
要执行的命令。
return_var
如果提供 return_var 参数, Unix 命令的返回状态会被记录到此参数。
返回值:
没有返回值。
1、直接运行
<?php
$re = exec('python ceshi.py', $out);
// $re = iconv('gbk', 'utf-8', $re);
var_dump($out);
echo '<br/>';
var_dump($re);
py文件
def send():
data = '1,2,3,4,5'
print(data)
if __name__ == '__main__':
send()
(重要说明:如果Python脚本返回的数据中含有中文,需要使用iconv('gbk', 'utf-8', $re);
进行转义)
py文件接受参数
header("Content-type:text/html;charset=utf-8");
// 测试PHP执行python代码
$a = 5;
$b = 8;
$c = 'Davidszhou的PHP操作带参数的python脚本并返回结果';
$d = urlencode($c);
unset($out);
$c = exec("C:\python35\python plug/index.py {$a} {$b} {$d}",$out,$res);
print_r(urldecode($out[0]));
echo "<br>";
echo '外部程序运行是否成功:'.$res."(0代表成功,1代表失败)";
py文件
#-*- coding:utf-8 -*-
import sys
def ceshi(a,b,c):
d = int(a)+int(b)
r = int(d)+c
return r
if __name__ == "__main__":
res = ceshi(a=sys.argv[1],b=sys.argv[2],c = sys.argv[3])
print(res)
exec问题:
exec("C:\python35\python plug/index.py {$a} {$b} {$d}",$out,$res):"C:\python35\python":
这是本地环境中python安装的绝对环境,‘plug/index.py’:这个是python脚本的目录,后面{$a} {$b} {$d}是紧随的参数注意它与python脚本目录之间以及每个参数之间的空格,
python如何接收PHP给他传的参数
python接收PHP传参数主要通过sys这个模块:
解释(来自python手册):
sys.argv
传递给Python脚本的命令行参数列表。argv[0]是脚本的名称(是否是完整的路径名这要取决于操作系统)。如果使用解释器的-c命令行选项执行命令,则argv[0]设置为字符串'-c'如果无脚本名称传递给 Python 解释器, argv[0]是空字符串。
再看一个例子
$canshu1 = '这是PHP传过来的参数';
$canshu2 = date('Y-m-d');
$re = exec("python ceshi.py $canshu1 $canshu2");
$re = iconv('gbk', 'utf-8', $re);
var_dump($re);
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]