如果我的分享对你有帮助,请关注我,一起向上进击。
phpy 是识沃团队最新推出的开源项目,目标是为 PHP
引入Python
生态,来填补PHP
生态的空缺和不敷。phpy
使得PHP
可以调用所有Python
的包。
包括当下非常盛行的 PyTorch
、transformers
、TensorFlow
等AI
库,以及Numpy
、Pandas
、Scikit
等科学打算库,还可以利用PyQt
、wxPython
等图形界面库。
GitHub 地址:https://github.com/swoole/phpy
Gitee 地址:https://gitee.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/python
Python
主程序
/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 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.m4
中Python
路径是否精确。若Python
的安装路径不是/opt/anaconda3
,需修正为精确的安装路径。
cd phpyphpize./configuremake install
安装成功后,修正
php.ini
,加入extension=phpy.so
,实行php -m
和php --ri phpy
检讨是否成功加载扩展。作为
Python
模块
cmake .make -j
实行成功后,会天生
tests/lib/phpy.so
文件。可以在Python
中直接导入此模块。利用方法导入 Python 模块
import phpy
实行函数
$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
的例子一个基于 transformers 的情绪剖析模型推理实现
<?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;
<?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 入门书的电子版
见告你更多细节干货
欢迎围不雅观我的朋友圈
👆每天更新所想所悟