<?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/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。作为
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的情感分析模型推理实现