phpy,为 PHP 引入 Python 生态

为 PHP 引入 Python 生态的经验分享 将一些目录加入到加载路径列表中。,需修改为正确的安装路径。检查是否成功加载扩展。 阅读详情

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。

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

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*

编译依赖

  1. Python 3.10 或以上版本,建议使用 conda 工具来安装

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

  1. PyCore::import('sys')->path->append('/workspace') 将 /workspace 添加到 sys.path 中

  2. 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 的例子

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

2da188d7e9ed7e3329003737d7654007.jpeg

一个基于 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: null,
);

$rs= $distilled_student_sentiment_classifier("I love this movie and i would watch it again and again!");
var_dump(PyCore::scalar($rs));

941caa731216b52e8fee296b30ddc85d.jpeg

- EOF -

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

推荐阅读  点击标题可跳转

1、Python 项目工程化最佳实践

2、Python 可以比 C 还要快!

3、streamlit,一个超强的 Python 库

4、豆瓣8.9分的C++经典之作,免费送!

5、Python 3.12 版本有什么变化?

回复下方「关键词」,获取优质资源

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

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

👇关注我的公众号👇

告诉你更多细节干货

0c7d24a99ef215cefe28c91d44f6f150.jpeg

欢迎围观我的朋友圈

👆每天更新所想所悟

phpy:phPy是一种从Python调用旧版PHP函数的简单方法 P phPy是从Python调用旧版PHP函数的简单方法。 安装 您可以从PyPI安装软件包: $ pip install phpy 要求 phPy使用php5-cli。 您必须使用apt-get或yum安装php5-cli软件包。 $ apt-get install php5-cli $ yum install php 例子 function LegacyPHPFunction ( $ arg1 , $ arg2 , $ arg3 ) { //... original codes... $ result = array ( "foo" => $ arg1 , "bar" => $ arg2 , ); echo json_encode ( $ result ); } from phpy import PHP #php 立即下载

相关推荐

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1047

phpy :PHP 与 Python 互调用库,为 PHP 引入 Python 生态,PHP 也可以写 AI 了

phpy 是识沃团队最新推出的开源项目,目标是为PHP引入Python生态,来弥补PHP生态的空缺和不足。phpy使得PHP可以调用所有Python的包。包括当下非常流行的PyTorchTensorFlow等AI库,以及NumpyPandasScikit等科学计算库,还可以使用PyQtwxPython等图形界面库。不建议在短生命周期运行环境下使用,频繁地导入/销毁模块的开销会消耗大量资源。

heshihu2019的博客 1809

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份IEC61850通信协议从理论到实践的完整测试验证实战指南。针对MMS、GOOSE、SV三大核心协议,详细阐述了测试环境搭建、自动化脚本编写、性能与异常测试方法,并分享了常见避坑经验,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备在现场的互联互通与稳定可靠运行。

neovim7hacker的博客 156

phpy 连接 PHP与Python生态 跨界合作 PHPY搭建 已解决

1、在日常功能开发中,难免会使用python的计算库,同时自己要是一名PHP开发工程师。就在最近有相应的需求,索性使用phpy来进行功能开发。

PHP代码的博客 824

ThingsBoard - 设备接入

设备接入笔记

qq_53839898的博客 1456

01 Python学习总结:Python简介及入门

Python 是一门高级编程语言,以其简洁、易读和强大的功能而广受欢迎。它适用于多种应用场景,包括 Web 开发、数据分析、人工智能、自动化脚本等。以下是 Python 的简介及入门知识总结,帮助你快速了解并开始学习 Python。

数据知道的博客 1万+

探索语言融合的边界:phpy - Python与PHP交互库

探索语言融合的边界:phpy - Python与PHP交互库 项目介绍 在当今的编程世界里,语言之间的界限不再那么清晰。phpy,一个创新的开源项目,正是为了打破这些限制而诞生。它允许你在PHP环境中无缝地使用Python的功能,反之亦然,无需任何内嵌或复杂的桥接机制。只需简单的调用,就可以让两种语言的强大力量融为一体。 项目技术分析 phpy基于对底层语言特性的深刻理解,通过在同一个进程中创建并...

gitblog_00093的博客 648

Python爬虫实战:利用Playwright与异步技术高效抓取链家十万级二手房数据

在开始编写代码之前,我们首先需要为项目选择合适的技术栈。1. 传统方案:Requests + BeautifulSoup优点: 简单、轻量、学习成本低。直接发送HTTP请求获取HTML,然后解析。缺点: 对于大量由JavaScript动态渲染的内容无能为力。现代网站(包括链家)大量使用JS来加载数据和实现交互,简单的HTTP请求无法获取到完整的页面内容。此外,容易被基于IP或请求头特征的反爬机制拦截。2. 进阶方案:Selenium优点。

2201_76125261的博客 891

PHPY 开源项目教程

PHPY 开源项目教程 项目介绍 PHPY 是一个基于 Swoole 的高性能 PHP 扩展,旨在提供更强大的异步编程能力和更好的性能。它通过扩展 PHP 语言的边界,使得 PHP 开发者能够更高效地处理并发任务和网络通信。 项目快速启动 安装 PHPY 首先,确保你已经安装了 Swoole 扩展。然后,通过以下命令安装 PHPY: git clone https://github.com/swo...

gitblog_00138的博客 589

SE80 Repository Information System 在 SAP CRM WebClient UI 组件分析中的实战指南

在 SAP CRM WebClient UI 开发过程中,如何快速定位组件、视图、上下文节点以及各类运行时对象,一直是调试效率的关键。(后文简称RIS)正是隐藏在SE80里的瑞士军刀,帮助开发者按照组件集、数据元素、上下文节点属性等多维条件进行交叉检索。官方博客将它描述为本文结合多年项目经验,系统梳理RIS的功能脉络与实战技巧,同时引入真实案例,示范如何借助它在几分钟内完成以往动辄数小时的排查任务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2万+

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2435

PHP与Python无缝融合,开启跨语言开发新纪元

PHPY 是识沃团队推出的开源项目,旨在为 PHP 引入 Python 生态,弥补 PHP 生态的不足。通过 PHPY,PHP 开发者可以直接调用 Python 的模块和函数,极大地扩展了 PHP 的功能边界。自发布以来,PHPY 获得了国内外开发者的一致好评,并在多个场景中得到了验证。经过一年的迭代,PHPY 修复了大量内存泄漏和崩溃问题,并新增了许多强大的特性。本文将详细介绍这些新特性。经过一年的迭代,PHPY 的稳定性和功能性都得到了显著提升。

每日一贴 1585

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(一)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包

慕羽★的博客 3938

phpy:连接 PHP 与 Python 生态

上周我们发布了phpy项目的第一个版本,收到了大量PHP开发者的关注,许多开发者向我们提交问题、意见和建议、Issues和。经过一周的优化和修改完善,phpy又得到了一些突破性进展。

m0_58477260的博客 1196

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

phply项目使用教程

phply项目使用教程 1. 项目介绍 phply是一个用Python编写的PHP解析器,基于PLY(Python Lex-Yacc)工具包。该项目的主要目的是将PHP代码转换为Python代码,或者在Python环境中运行PHP模板。phply不仅可以帮助开发者学习PHP解析技术,还可以用于将PHP代码转换为其他格式,如JSON或Jinja2模板。 2. 项目快速启动 2.1 安装 首先,确保你...

gitblog_00129的博客 564

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

phpy通用扩展:让PHP和Python手拉手

大家都知道,世界上有很多种编程语言,比如PHP和Python。它们就像不同的工具,各有各的用处。PHP主要用于开发网站,能让网页动起来,比如登录、注册、提交表单等功能都离不开它。而Python则在处理数据、做科学计算等方面很厉害。phpy通用扩展就像是一个神奇的桥梁,它能让PHP和Python互相交流。有了它,PHP代码就可以调用Python的功能,比如用Python强大的数据分析库来处理一些复杂的数据,然后再把结果拿回PHP里用。这就相当于把两种语言的优势结合起来了,让我们的项目变得更强大。

1394

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PHP 基础知识全解析

PHP 是弱类型语言,变量在声明时不需要定义数据类型,PHP 会根据变量的值,自动为变量设置数据类型。PHP,全称 "Hypertext Preprocessor",是一种流行的通用开源脚本语言,特别适合于 web 开发。PHP 可以用来处理表单,存取和修改数据库信息,跟踪用户,甚至可以用来创建图片。学习 PHP 需要实践和时间,但一旦你掌握了基础知识,你就可以开始创建动态和互动的网页。在 PHP 中,提供了两种类型的函数:内置函数和用户自定义函数。PHP 可以连接到各种数据库,最常见的是 MySQL。

鑫和皓的博客 1257

PHP基础知识 - PHP函数大全

PHP函数大全

Super乐De博客 1557

真的没办法一心一意麽? php 文件操作

"r" (只读方式打开,将文件指针指向文件头) "r+" (读写方式打开,将文件指针指向文件头) "w" (写入方式打开,清除文件内容,如果文件不存在则尝试创建之) "w+" (读写方式打开,清除文件内容,如果文件不存在则尝试创建之) "a" (写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之) "a+" (读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件

想个标题偏头痛 735

PHP基础语法

二、PHP基础语法1.PHP语法结构a.标准风格:

y__jinhao的博客 277

探索 Python.org:Python 编程语言的官方资源库

Python.org 是 Python 编程语言的官方资源库,它提供了有关 Python 的所有信息和资源,包括文档、下载、社区等。无论你是初学者还是经验丰富的开发者,都可以在这里找到所需的内容。 本文将向您介绍 Python.org 中的一些重要功能和资源,并指导您如何充分利用它们。 ## Python.org 的用途 ### 学习 Python 如果您是初学者,Python.org 提

gitblog_00087的博客 1317

php代码转python工具_python写的文件转码小工具

source insight竟然不支持utf-8,为支持中文显示,故写一python小程序将某个目录下所有文件全部从utf-8转码为gbk代码如下:#!/usr/local/bin/python# -*- coding: utf-8 -*-'''source insight竟然不支持utf-8,为支持中文显示,故写该程序将某个目录下所有文件全部从utf-8转码为gbkusage: chmod +x...

weixin_39758956的博客 454

php 源码封装so,在Linux下用C扩展PHP(打包成so)的方法

本文主要讲一下在Linux下用打包C扩展程序.so文件和Windows下的不同,详细的代码和配置方案请参加另一篇博客:http://blog.youkuaiyun.com/maverick1990/article/details/46519045步骤:1.安装php环境到目录 /usr/local/php/ 目录下2.下载相同版本的php源码包,安装到 /root/php-5.6.9/ 目录下,可到官网htt...

weixin_35426348的博客 618

给 LikeShop 加一个自定义分销佣金规则:改了哪几个文件

为在LikeShop中添加自定义分销佣金规则(如二级分销商团队激励),需精准定位核心文件:DistributionLogic.php 实现计算逻辑扩展,后台配置逻辑支持可配性,数据库迁移新增字段。关键在于不硬编码比例,通过租户隔离的配置表实现灵活管理。结算与售后逻辑仅在涉及差异化条件时才需调整。务必验证全链路状态流转,避免“算对但结不了”或“退了仍返佣”问题。核心改动聚焦于计算、配置、数据三端,确保可维护性与可配置性。

hudie765的博客 300

数字证书与身份认证仿真实验配置

用户证书指纹: 4C:77:13:77:4B:18:ED:59:D8:6C:36:58:A6:00:51:FD:04:C5:A4:92:19:F1:64:CA:EA:A1:80:16:0F:EC:D1:00。根证书指纹: E3:CB:22:0C:B4:09:2F:83:07:84:AE:EE:6C:BF:F0:24:9F:3F:75:F5:AA:54:99:52:F5:D1:0F:DC:6C:F6:98:C9。[1] CA 根证书自签名验证: /opt/ca/certs/ca.crt: OK。

lightningyang的博客 412

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 561
上一篇: 30年前的 IDE 长啥样?
下一篇: 推荐一门 MIT 的计算机入门课
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值