网易首页 > 网易号 > 正文 申请入驻

phpy:PHP与Python互调用库,为PHP引入Python生态

0
分享至

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

包括当下非常流行的PyTorchtransformersTensorFlowAI库,以及NumpyPandasScikit等科学计算库,还可以使用PyQtwxPython等图形界面库。

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

  • Gitee 地址:https://gitee.com/swoole/phpy

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

编译安装

phpy可以作为PHP的扩展,也可以作为PythonC模块。既可以在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*
编译依赖
  1. Python 3.10或以上版本,建议使用conda工具来安装

  2. 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.solibphp.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.m4Python路径是否正确。若Python的安装路径不是/opt/anaconda3,需修改为正确的安装路径。

cd phpy
phpize
./configure
make install

安装成功后,修改php.ini,加入extension=phpy.so,执行php -mphp --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自定义的包,可以通过下面的步骤实现加载:

  1. PyCore::import('sys')->path->append('/workspace')/workspace添加到sys.path

  2. 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:字符串

  • PyModulePython包,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的例子$tkinter= PyCore::import('tkinter');
$root= $tkinter->Tk();
$root->title('我的窗口');
$root->geometry("500x500");
$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();

一个基于transformers的情感分析模型推理实现$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));

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
大暴雨!冰雹!8级雷暴大风!首个山洪红色预警!气象部门紧急提醒→

大暴雨!冰雹!8级雷暴大风!首个山洪红色预警!气象部门紧急提醒→

鲁中晨报
2024-06-16 14:43:05
伊朗态度大变?突然召见中国大使,当面发出抗议,中方回应亮了!

伊朗态度大变?突然召见中国大使,当面发出抗议,中方回应亮了!

诉人世间
2024-06-17 00:30:02
90年代台海危机中的心酸:中国空军苏-27战斗机,吓人的花瓶

90年代台海危机中的心酸:中国空军苏-27战斗机,吓人的花瓶

慎独赢
2024-06-16 11:51:15
理想车友聚会多车连环追尾的瓜

理想车友聚会多车连环追尾的瓜

一个岛岛
2024-06-16 16:42:12
镜报:曼城老板与瓜迪奥拉会面,希望说服他与俱乐部续约

镜报:曼城老板与瓜迪奥拉会面,希望说服他与俱乐部续约

直播吧
2024-06-16 09:57:12
不打了?CBA最强外援被曝欲离队,广东男篮有望重金签下他!

不打了?CBA最强外援被曝欲离队,广东男篮有望重金签下他!

绯雨儿
2024-06-16 16:16:04
大陆男子驾艇成功登台湾细节曝光:突破5亿监控系统后,自己报警

大陆男子驾艇成功登台湾细节曝光:突破5亿监控系统后,自己报警

消失的电波
2024-06-13 10:01:58
《玫瑰的故事》那么明显的穿帮镜头,竟没有剪掉,看着真是一脸懵

《玫瑰的故事》那么明显的穿帮镜头,竟没有剪掉,看着真是一脸懵

娱乐圈笔娱君
2024-06-14 17:55:48
国家终于不再原谅王濛,77枚金牌不是万能,而自大只会被抛弃

国家终于不再原谅王濛,77枚金牌不是万能,而自大只会被抛弃

兰子记
2024-06-11 18:28:00
国足豪赌世界杯!足协锁定巴西外援 最快1月完成归化

国足豪赌世界杯!足协锁定巴西外援 最快1月完成归化

球事百科吖
2024-06-16 16:34:09
谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

小萝卜天下事
2023-07-21 21:57:53
把150万给儿子,女儿一家没了音讯,10年后我们在女儿旧房前痛哭

把150万给儿子,女儿一家没了音讯,10年后我们在女儿旧房前痛哭

半夏解语
2024-06-15 07:00:03
3:0波兰,龚翔宇大哭原因曝光,李盈莹背后轻抱,低迷之人该清醒

3:0波兰,龚翔宇大哭原因曝光,李盈莹背后轻抱,低迷之人该清醒

东球弟
2024-06-16 21:45:46
拜登已签字,22国一致对华征税,中方加量囤粮食,瑞典的努力白费

拜登已签字,22国一致对华征税,中方加量囤粮食,瑞典的努力白费

影视解说阿相
2024-06-15 12:39:36
中国女排3比0波兰数据:队长袁心玥16分最高,李盈莹14分次席

中国女排3比0波兰数据:队长袁心玥16分最高,李盈莹14分次席

直播吧
2024-06-16 22:10:57
G7为何敢用冻结俄资产做担保为乌提供500亿,因为俄T-62坦克上场

G7为何敢用冻结俄资产做担保为乌提供500亿,因为俄T-62坦克上场

山河路口
2024-06-15 23:54:24
一个上市公司能无耻到什么程度呢?

一个上市公司能无耻到什么程度呢?

流苏晚晴
2024-06-14 20:24:29
塞尔维亚1-1英格兰,弗拉霍维奇建功,凯恩哑火,欧洲中国队丢人

塞尔维亚1-1英格兰,弗拉霍维奇建功,凯恩哑火,欧洲中国队丢人

邮轮摄影师阿嗵
2024-06-16 20:11:29
外媒:以色列面对真主党左右为难

外媒:以色列面对真主党左右为难

参考消息
2024-06-16 09:57:07
“这里不是中国!不会有人惯你们!”中国大妈已经沦落成世界公害

“这里不是中国!不会有人惯你们!”中国大妈已经沦落成世界公害

三月柳
2024-06-01 15:24:12
2024-06-17 01:48:49
开源中国
开源中国
每天为开发者推送最新技术资讯
6329文章数 34225关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

亲子
家居
房产
数码
健康

亲子要闻

玩这个游戏的都是勇士

家居要闻

空谷来音 朴素留白的侘寂之美

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

数码要闻

PCIe 5.0 SSD终于要便宜了!群联E31T主控无缓存能跑12GB/s

晚餐不吃or吃七分饱,哪种更减肥?

无障碍浏览 进入关怀版