如果我的分享对你有帮助,请关注我,一起向上进击。

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

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

将php改写也Pythonphpy为 PHP 引入 Python 生态 React

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

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

不建议在 php-fpm/apache

短生命周期运行环境下利用,频繁地导入 / 销毁模块的开销会花费大量资源

编译安装

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

作为 Python模块时依赖PHPembed 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.solibphp.so

sudo ldconfig -p |grep phplibphp7.so (libc6,x86-64) => /opt/php-7.4/lib/libphp7.solibphp.so (libc6,x86-64) => /opt/php-8.0/lib/libphp.sosudo ldconfig -p |grep pythonlibsamba-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.0libpython3.11.so.1.0 (libc6,x86-64) => /opt/anaconda3/lib/libpython3.11.so.1.0libpython3.11.so (libc6,x86-64) => /opt/anaconda3/lib/libpython3.11.solibpython3.8.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0libpython3.8.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.8.solibpython3.5m.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0libpython3.so (libc6,x86-64) => /opt/anaconda3/lib/libpython3.solibpython2.7.so.1.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0libpython2.7.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpython2.7.so

作为 PHP 扩展

检讨 config.m4Python路径是否精确。
Python的安装路径不是/opt/anaconda3,需修正为精确的安装路径。

cd phpyphpize./configuremake 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自定义的包,可以通过下面的步骤实现加载:

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::scalarPyObject工具转为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 的例子

<?php$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 的情绪剖析模型推理实现

<?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: ,);$rs= $distilled_student_sentiment_classifier(\公众I love this movie and i would watch it again and again!\公众);var_dump(PyCore::scalar($rs));

- EOF -

文章已经看到这了,别忘了在右下角点个“赞”和“在看”鼓励哦~

点击标题可跳转

回答关键词「 pybook03」,领取攻击的Grey与小伙伴一起翻译的《Think Python 2e》电子版

回答关键词「书单02」,领取攻击的Grey整理的 10 本 Python 入门书的电子版

见告你更多细节干货

欢迎围不雅观我的朋友圈

👆每天更新所想所悟