0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

phpy:PHP与Python互调用库

OSC开源社区 来源:OSC开源社区 2023-12-12 10:43 次阅读

phpy 是识沃团队最新推出的开源项目,目标是为PHP引入Python生态,来弥补PHP生态的空缺和不足。phpy使得PHP可以调用所有Python的包。 包括当下非常流行的PyTorch、transformersTensorFlowAI库,以及Numpy、Pandas、Scikit等科学计算库,还可以使用PyQt、wxPython等图形界面库。

不建议在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/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。

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

cd phpy
phpize
./configure
make install

安装成功后,修改php.ini,加入extension=phpy.so,执行php -m和php --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::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的例子

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();

image.png

一个基于transformers的情感分析模型推理实现

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));

image.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    87

    文章

    26443

    浏览量

    264061
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32394
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83467
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11455

原文标题:phpy:PHP与Python互调用库,为PHP引入Python生态

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    为什么Python Web流行度不如PHP

    apache/nginx,fastcgi manager 负责启动 php-cgi 进程等,而 PHP 应用基于文件的调用方式并不需要操心更多的维护。  这对于如 Dreamhost 之类的虚拟主机
    发表于 12-02 16:34

    零基础学编程,选PHP还是Python

    对于许多想学编程的人,零基础选择学习哪个课程总是很纠结?今天小编就给大家解疑答惑。在这两门语言中,小编建议大家选择Python。为什么要大家选择Python呢?看看PythonPHP
    发表于 05-07 18:12

    如何用php调用mysql数据实现增删改查

    php调用mysql数据实现增删改查
    发表于 04-09 12:53

    nodejs与java的互调用方法

    nodejs 与java的互调用方法很多,我们可选的是使用oracle 新的vm 引擎(graalvm很不错) 还有就是基于browserify进行包装,同时给java 提供一套require
    发表于 11-04 07:31

    什么是PHP加密扩展

    在本文开始正文开始之前,我们先来了解一下什么是PHP加密扩展PHP中不但几种加密函数(md5,crypt,sha1),在此之外,PHP中还有一些功能比较全面的加密扩展
    发表于 09-01 07:13

    PHPPython对比 如何选择?

    尽管 RESTful API 和跨平台库已经使网页开发容易起来,但依然没有解决阻碍并隔分开发者、管理者和消费者的由来已久的问题:PHP vs. Python,到底该选哪种语言?
    发表于 05-28 01:31 4427次阅读

    python代码示例之基于Python的日历api调用代码实例

    本文档的主要内容详细介绍的是python代码示例之基于Python的日历api调用代码实例。
    发表于 09-06 14:25 42次下载
    <b class='flag-5'>python</b>代码示例之基于<b class='flag-5'>Python</b>的日历api<b class='flag-5'>调用</b>代码实例

    LabVIEW不同VI之间相互调用的详细资料说明

    本文档的主要内容详细介绍的是LabVIEW不同VI之间相互调用的详细资料说明,有需要的拿去。
    发表于 12-17 08:00 28次下载
    LabVIEW不同VI之间相<b class='flag-5'>互调用</b>的详细资料说明

    PHP云4.1标签调用大全包含代码的资料免费下载

    为了更加方便PHP 云用户使用更加便捷,我们精心给大家整理出:PHP 云标签调用开发文档。用户只要懂HTML 和CSS 可以对照PHP 云标签就可以实现自己的布局需求。
    发表于 02-25 11:52 2次下载
    <b class='flag-5'>PHP</b>云4.1标签<b class='flag-5'>调用</b>大全包含代码的资料免费下载

    C语言与C++相互调用

        1C与C++相互调用 在一个嵌入式系统中大部分的底层和驱动层更多的是采用C语言来进行开发,而上层应用、服务更多的采用C++等高级语言来进行面向对象等方面的开发方式,那么就存在一个上层调用底层
    的头像 发表于 01-18 11:05 2895次阅读
    C语言与C++相<b class='flag-5'>互调用</b>

    C代码与javaScript函数的相互调用问题应该如何解决

    本文档的主要内容详细介绍的是C代码与javaScript函数的相互调用问题应该如何解决。
    发表于 03-05 11:47 17次下载

    使用PythonPHP获取天气信息

    电子发烧友网站提供《使用PythonPHP获取天气信息.zip》资料免费下载
    发表于 01-04 11:03 1次下载
    使用<b class='flag-5'>Python</b>和<b class='flag-5'>PHP</b>获取天气信息

    Python环境搭建和LabVIEW中的调用

    本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。
    的头像 发表于 10-13 17:56 777次阅读
    <b class='flag-5'>Python</b>环境搭建和LabVIEW中的<b class='flag-5'>调用</b>

    python调用windows命令

    Python是一种强大的编程语言,可以用于开发各种不同类型的应用程序。其中一个常见的用途是使用Python调用Windows命令来执行特定的任务。在本文中,我们将详细讨论如何使用Python
    的头像 发表于 11-29 14:34 483次阅读

    phppython一样吗

    PHPPython是两种不同的编程语言,尽管它们都用于开发Web应用程序,但它们有许多不同之处。从语法、用途、社区到性能和生态系统等方面来讲,PHPPython在许多方面都有不同之
    的头像 发表于 12-04 15:47 441次阅读