起初是为了实现一个小需求,想要在JQuery执行的AJAX异步请求时在服务器端调用执行Python脚本。而Windows服务器端部署的WEB环境是Apache+PHP,在AJAX异步请求时根本不能直接调用Python脚本。 因为web开发语言是php而非Python的Django和Flask等开发框架。AJAX是可以调用执行服务器端的脚本文件,但它的本质仍是HTTP的请求。 所以就只能在HTTP请求中想办法调用Python脚本,也就在PHP程序中调用执行python脚本。

这里就要用到PHP的内置函数exec() 和system() ;

PHP的exec() 和system() 函数区别:

(1)system()

原型:string system (string command [, int return_var])

system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。

(2)exec()

原型:string exec (string command [, string array [, int return_var]])

exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。

可以看出两个函数的区别就是PHP在调用执行外部命令后,system()函数将执行的结果输出并返回给PHP程序。而 exec() 函数在调用执行外部命令后不会将结果输出,只是返回结果。

程序代码实现和对比:

(1)in.php程序使用exec()函数代码及解析:

PHP 中调用 Python 并获取运行结果

(2)test.py程序代码:

PHP 中调用 Python 并获取运行结果

(3)PHP程序执行后效果1:

PHP 中调用 Python 并获取运行结果

这样就利用exec()函数实现了对python脚本的调用,下面说一下将in.php程序中的exec()函数替换成system()函数后的执行效果。

(4)in.php程序使用system()函数代码及解析:

PHP 中调用 Python 并获取运行结果

(5)PHP程序执行后效果2:

PHP 中调用 Python 并获取运行结果

可以看出使用system()函数时,执行python程序时不但返回结果,而且将结果输出了,而exec()函数只是返回结果,没有输出。

扩展应用:(php web开发数据调用)

想要在网页上显示其它网站上的数据内容时,都需要网站提供数据的调用接口直接调用,如果没有接口,就需要用爬虫将数据爬回来后保存到数据库,在用程序从数据库中取出数据展示出来。(当然也可以用到php的curl库进行数据爬取后进行展示,但是个人认为在编程语言中做爬虫最简单并且强大的还是Python),而如果在PHP程序中直接调用python脚本进行爬虫,然后再将数据展示到网页上,这样就可以省去插入数据到数据库和从数据库读取数据的过程,这种做法对一些实时数据的爬取还是比较有用的,但是一定会影响网页的加载速度。下面将以前写的一个爬虫爬到的数据直接展示到web网页上供大家参考。

(1)php程序代码:

<?PHP
$output=exec('python test1.py');
echo $output;
?>

(2)python爬虫代码:

import requests
import json
class WeatherSpider(object):
    def __inti__(self):
        pass
    def request(self,url):
        headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
        'Referer': 'http://www.weather.com.cn/weather40d/101060201.shtml'
        }
        return requests.get(url,headers=headers)
    def create_url(self):
        year = '2016'
        for i in range(1,2):
            month = str(i) if i > 9 else "0" + str(i)
            url = "http://d1.weather.com.cn/calendar_new/" + year + "/101060201_" + year + month + ".html"
            self.get_data(url)
    def get_data(self,url):
        respone = self.request(url).content
        json_str = respone.decode(encoding='utf-8')[11:]
        weathers = json.loads(json_str)
        data = ""
        for weather in weathers:
            data = data+weather.get('date')+'星期'+weather.get('wk')+weather.get('hmax')+weather.get('hmin')+weather.get('hgl')+"<br>"
        print (data)
if __name__ == '__main__':
    jl_weather = WeatherSpider()
    jl_weather.create_url()

(3)web网页爬虫展示:

PHP 中调用 Python 并获取运行结果


Python sys.argv

PHP 借助 shell_exec 通过类似于 python sum.py $aa $bb 的形式以执行系统命令的方式传递参数给Python文件;

Python 则通过 sys.argv(需引入sys模块) 来接收命令中所包含的参数(需要注意的是:此时传入的参数都会被默认为 str 类型,需要在函数内部进行解析和转换)并将处理结果通过print 函数输出;

PHP 通过将 shell_exec 函数返回的结果赋给变量实现取得 Python 返回数据的效果。

php index.php

<form action="" method="post">
    请输入a:<input type="number" name="a" value="请输入a"><br> 请输入b:
    <input type="number" name="b" value="请输入b">
    <button type="submit">计算</button>
</form>
<?php
$aa = $_POST["a"];
$bb = $_POST["b"];
$cmd = shell_exec("python sum.py $aa $bb");
echo "a与b的和是: $cmd";

python sum.py

import sys

# 以下两行解决中文乱码问题
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())

a, b = sys.argv[1], sys.argv[2]   # 接收位置参数
print(int(a)+int(b))

PHP 中调用 Python 并获取运行结果

字符串示例

?php

$name = '订单5210804229002567电子发票.pdf';
$cmd = shell_exec("python sum.py $name");

echo $cmd;
import sys

# 以下两行解决中文乱码问题
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())

a = sys.argv[1]   # 接收位置参数
print(a)

PHP 中调用 Python 并获取运行结果

PHP (shell_exec()、exec()、passthru()、system())的区别

PHP:除了使用 shell_exec(),还可以使用 exec()、passthru() 和 system() 函数调用系统命令,

它们四者的区别如下:

shell_exec()

通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

也就是说, PHP先运行一个 shell 环境, 然后让 shell 进程运行你的命令, 并且把所有输出以字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回 null。

exec()

与 shell_exec() 不一样, exec 不会创建 shell 进程, 可以理解是 php 进程直接创建一个子进程, 运行指定的命令, 返回值只返回命令的最后一行, 所有的返回以参数形式返回。

passthru()

与 exec() 类似, 唯一不同的是, 命令的所有输出返回内容都不再导入到 PHP 环境, 而是直接作为输出内容, 返回到浏览器的输出上, 等效是把所有返回内容直接 echo 输出。

system()

这个方法和 passthru() 类似, 但是 system() 方法会在程序的每行输出的时候执行一次缓存输出动作, 可以理解为, 只要外部程序输出一行, php 就会马上把内容推送到浏览器, 无论这个内容是否足够大。

php通常为了输出效率, 都会有一个输出缓存, 会等到输出内容足够大之后, 再一次输出返回. system() 方法则强制输出内容立刻推送, 即使输出的内容只有一个字母. 如果客户端具有实时打印服务器的返回 http 内容流的能力, 就可以看到 system() 的实时推送效果。


上一篇:python 通过函数名判断函数是否存在及调用

下一篇:如何在PHP中调用Python并获取运行结果

评论列表

已有1位网友发表了看法:

1. 上海网站建设    2023-06-05 22:40:43  回复该评论
感谢分享
发表评论
称呼
邮箱
网址
验证码(*)
热评文章
相关阅读