phpy之PHP与Python互调库实现AI编程

2024-03-01 0 782
目录
  • phpy
    • 编译安装
    • 编译依赖
    • 作为PHP扩展
    • 作为Python模块
  • 使用方法
    • 导入 Python 模块
    • 执行函数
    • 读取属性
    • 加载路径
    • 内置方法
    • 内置类
    • 继承关系
    • 整数
    • 构造
    • 运算
    • 命名参数
    • 回调函数
  • 实际案例
    • 基于tkinter实现GUI的例子
    • 一个基于transformers的情感分析模型推理实现

phpy

phpy 是识沃团队最新推出的开源项目,目标是为PHP引入Python生态,来弥补PHP生态的空缺和不足。phpy使得PHP可以调用所有Python的包。

包括当下非常流行的PyTorch、transformers、TensorFlow等AI库,以及Numpy、Pandas、Scikit等科学计算库,还可以使用PyQt、wxPython等图形界面库。

  • GitHub 地址:https://github.com/swoole/phpy

不建议在php-fpm/apache短生命周期运行环境下使用,频繁地导入/销毁模块的开销会消耗大量资源

编译安装

phpy可以作为PHP的扩展,也可以作为Python的C模块。既可以在PHP代码中调用Python的库,也可以在Python中调用PHP的类和函数。

作为Python模块时依赖PHP的embed SAPI,检查PHP的目录中,确保存在libphp.so

ll /opt/php-8.1/lib/libphp.so
-rwxr-xr-x 1 htf htf 39397224 11月 30 19:25 /opt/php-8.1/lib/libphp.so*

编译依赖

  • Python 3.10或以上版本,建议使用conda工具来安装
  • PHP 8.1或以上版本

Python将安装到/opt/anaconda3目录下

  • /opt/anaconda3/bin/pythonPython主程序
  • /opt/anaconda3/include/python3.11头文件
  • /opt/anaconda3/lib/python3.11动态链接库目录

另外需要配置/etc/ld.so.conf.d/conda.conf加入/opt/anaconda3/lib和/opt/php-8.1/lib。执行ldconfig检查是否可以找到libpython3.11.so和libphp.so。

sudo ldconfig -p |grep php
libphp7.so (libc6,x86-64) => /opt/php-7.4/lib/libphp7.so
libphp.so (libc6,x86-64) => /opt/php-8.0/lib/libphp.so
sudo ldconfig -p |grep python
libsamba-policy.cpython-38-x86-64-linux-gnu.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libsamba-policy.cpython-38-x86-64-linux-gnu.so.0
libpython3.11.so.1.0 (libc6,x86-64) => /opt/anaconda3/lib/libpython3.11.so.1.0
libpython3.11.so (libc6,x86-64) => /opt/anaconda3/lib/libpython3.11.so
libpython3.8.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0
libpython3.8.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.8.so
libpython3.5m.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0
libpython3.so (libc6,x86-64) => /opt/anaconda3/lib/libpython3.so
libpython2.7.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
libpython2.7.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython2.7.so

作为PHP扩展

检查config.m4中Python路径是否正确。若Python的安装路径不是/opt/anaconda3,需修改为正确的安装路径。

cd phpy
phpize
./configure
make install

安装成功后,修改php.ini,加入extension=phpy.so,执行php -m和php –ri phpy检查是否成功加载扩展。

作为Python模块

cmake .
make -j

执行成功后,会生成tests/lib/phpy.so文件。可以在Python中直接导入此模块。

import phpy

使用方法

导入 Python 模块

$os = PyCore::import(\’os\’);

执行函数

$uname = $os->uname();

读取属性

echo $uname->sysname;

加载路径

可使用PyCore::import('sys')->path->append()将一些目录加入到加载路径列表中。例如:/workspace/app/user.py自定义的包,可以通过下面的步骤实现加载:

  • PyCore::import('sys')->path->append('/workspace')将/workspace添加到sys.path中
  • PyCore::import('app.user')将自动搜索sys.path找到对应的app/user.py包并载入

内置方法

  • PyCore::str()将对象转为字符串
  • PyCore::repr()
  • PyCore::type()获取对象的类型
  • PyCore::locals()获取当前空间内容的所有局部变量
  • PyCore::globals()获取所有全局变量
  • PyCore::hash()获取 Hash 值
  • PyCore::hasattr()检测对象是否存在某个属性
  • PyCore::id()获取对象的内部编号
  • PyCore::len()获取长度
  • PyCore::dir()获取对象所有的属性、方法
  • PyCore::int()构造一个整数
  • PyCore::float()构造一个浮点数
  • PyCore::fn()构造一个可调用函数
  • PyCore::scalar()将PyObject对象转为PHP的标量类型,例如PyStr将转为PHP 字符串,Dict/Tuple/Set/List将转为Array

内置类

  • PyObject:所有其他类型的基类
  • PyDict:字典类型,等同于PHP的关联数组
  • PyList:列表类型,等同于PHP的索引数组
  • PyTuple:元组,不可变的列表
  • PyStr:字符串
  • PyModule:Python包,PyModule也是PyObject的子类

PyObject是除了PyCore之外,所有其他类型的基类。非内置类的对象是PyObject的实例。PyObject实现了4个魔术方法,用于将操作映射到Python对象。

所有类方法、参数、返回值参考stubs目录中的文件。

继承关系

PyObject -> PyModule
-> PySequenece -> PyList
-> PyTuple
-> PySet
-> PyStr
-> PyDict
-> PyType

整数

Python语言是天然支持无限精度整型计算的,可以使用Python的整数计算能力来代替ext-bcmath

构造

使用PyCore::int()函数来构造一个数字,可以传入整数、浮点数、字符串来初始化。

$i1 = PyCore::int(12345678);
$i2 = PyCore::int(\’1234567890123456789012345678901234567890\’);
$i3 = PyCore::int(12345678.03);

运算

整数同样也是PyObject的实例,可以使用内置的方法类实现运算。

$i = PyCore::int(12345435);
var_dump(strval($i->__pow__(3)));
var_dump(strval($i->__add__(4)));

将输出1881564851360655187875,由于超过了64位最大精度,因此输出结果将自动转为字符串类型。

命名参数

phpy支持了命名参数,可以使用命名参数来调用Python的函数和方法。

顺序参数必须在前,命名参数必须在最后
kwargs($a, $b, $c, name: \’hello\’, world: \’rango\’);

对应的Python代码为:

kwargs(a, b, c, name: \’hello\’, world: \’rango\’)

回调函数

可将PHP的可调用对象作为Python的回调函数。使用PyCore::fn(callable $fn)包裹即可。

$m = PyCore::import(\’app.user\’);
$uuid = uniqid();
$rs = $m->test_callback(PyCore::fn(function ($namespace) use ($uuid) {
var_dump($namespace);
return $uuid;
}));

  • import app.user导入了一个自定义Python包
  • 调用了包中的一个函数test_callback,此函数接受一个参数为Python Callable对象
  • 使用PyCore::fn()包裹了一个Closure闭包对象作为回调,这里也支持函数名称字符串、对象方法的调用方式
  • 回调函数返回了一个字符串,在test_callback函数中会得到一个str类型返回值

可参考下方的Python tkinter例子。

实际案例

基于tkinter实现GUI的例子

<?php
$tkinter = PyCore::import(\’tkinter\’);
$root = $tkinter->Tk();
$root->title(\’我的窗口\’);
$root->geometry(\”500×500\”);
$root->resizable(False, False);
$button = $tkinter->Button($root, text: \”Click Me!!\”, command: PyCore::fn(function () {
var_dump(func_get_args());
echo \’click me!!\’ . PHP_EOL;
}));
$button->pack();
$tkinter->mainloop();

phpy之PHP与Python互调库实现AI编程

一个基于transformers的情感分析模型推理实现

<?php
$transformers = PyCore::import(\’transformers\’);
$os = PyCore::import(\’os\’);
$os->environ->__setitem__(\’https_proxy\’, getenv(\’https_proxy\’));
$distilled_student_sentiment_classifier = $transformers->pipeline(
model: \”lxyuan/distilbert-base-multilingual-cased-sentiments-student\”,
top_k: null,
);
$rs = $distilled_student_sentiment_classifier (\”I love this movie and i would watch it again and again!\”);
var_dump(PyCore::scalar($rs));

phpy之PHP与Python互调库实现AI编程

以上就是phpy之PHP与Python互调库实现AI编程的详细内容,更多关于phpy PHP与Python互调库的资料请关注悠久资源网其它相关文章!

您可能感兴趣的文章:

  • 一文搞懂接口参数签名与验签(附含javapythonphp版)
  • 在PHP程序中运行Python脚本(接收数据及传参)的方法详解
  • 如何在PHP中调用Python并获取运行结果
  • python和php哪个更适合写爬虫
  • 浅谈php调用python文件

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 PHP phpy之PHP与Python互调库实现AI编程 https://www.u-9.cn/biancheng/php/182112.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务