<?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 互调用库,为 PHP 引入 Python 生态
phpy 是识沃团队最新推出的开源项目,目标是为
PHP
引入Python
生态,来弥补PHP
生态的空缺和不足。phpy
使得PHP
可以调用所有Python
的包。包括当下非常流行的
PyTorch
、transformers
、TensorFlow
等AI
库,以及Numpy
、Pandas
、Scikit
等科学计算库,还可以使用PyQt
、wxPython
等图形界面库。编译安装
phpy
可以作为PHP
的扩展,也可以作为Python
的C
模块。既可以在PHP
代码中调用Python
的库,也可以在Python
中调用PHP
的类和函数。编译依赖
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
。作为
PHP
扩展检查
config.m4
中Python
路径是否正确。若Python
的安装路径不是/opt/anaconda3
,需修改为正确的安装路径。安装成功后,修改
php.ini
,加入extension=phpy.so
,执行php -m
和php --ri phpy
检查是否成功加载扩展。作为
Python
模块执行成功后,会生成
tests/lib/phpy.so
文件。可以在Python
中直接导入此模块。使用方法
导入 Python 模块
执行函数
读取属性
加载路径
可使用
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
目录中的文件。继承关系
整数
Python
语言是天然支持无限精度整型计算的,可以使用Python
的整数计算能力来代替ext-bcmath
构造
使用
PyCore::int()
函数来构造一个数字,可以传入整数、浮点数、字符串来初始化。运算
整数同样也是
PyObject
的实例,可以使用内置的方法类实现运算。将输出
1881564851360655187875
,由于超过了64位
最大精度,因此输出结果将自动转为字符串类型。命名参数
phpy
支持了命名参数,可以使用命名参数来调用Python
的函数和方法。对应的
Python
代码为:回调函数
可将
PHP
的可调用对象作为Python
的回调函数。使用PyCore::fn(callable $fn)
包裹即可。import app.user
导入了一个自定义Python
包test_callback
,此函数接受一个参数为Python Callable
对象PyCore::fn()
包裹了一个Closure
闭包对象作为回调,这里也支持函数名称字符串、对象方法的调用方式test_callback
函数中会得到一个str
类型返回值可参考下方的
Python tkinter
例子。实际案例
基于
tkinter
实现GUI
的例子一个基于
transformers
的情感分析模型推理实现