phpy之PHP與Python互調(diào)庫(kù)實(shí)現(xiàn)AI編程
phpy
phpy 是識(shí)沃團(tuán)隊(duì)最新推出的開(kāi)源項(xiàng)目,目標(biāo)是為 PHP 引入 Python 生態(tài),來(lái)彌補(bǔ) PHP 生態(tài)的空缺和不足。phpy 使得 PHP 可以調(diào)用所有 Python 的包。
包括當(dāng)下非常流行的 PyTorch、transformers、TensorFlow 等 AI 庫(kù),以及 Numpy、Pandas、Scikit 等科學(xué)計(jì)算庫(kù),還可以使用 PyQt、wxPython 等圖形界面庫(kù)。
- GitHub 地址:https://github.com/swoole/phpy
不建議在 php-fpm/apache 短生命周期運(yùn)行環(huán)境下使用,頻繁地導(dǎo)入/銷毀模塊的開(kāi)銷會(huì)消耗大量資源
編譯安裝
phpy 可以作為 PHP 的擴(kuò)展,也可以作為 Python 的 C 模塊。既可以在 PHP 代碼中調(diào)用 Python 的庫(kù),也可以在 Python 中調(diào)用 PHP 的類和函數(shù)。
作為 Python 模塊時(shí)依賴 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工具來(lái)安裝PHP 8.1或以上版本
Python 將安裝到 /opt/anaconda3 目錄下
/opt/anaconda3/bin/pythonPython主程序/opt/anaconda3/include/python3.11頭文件/opt/anaconda3/lib/python3.11動(dòng)態(tài)鏈接庫(kù)目錄
另外需要配置 /etc/ld.so.conf.d/conda.conf 加入 /opt/anaconda3/lib 和 /opt/php-8.1/lib 。執(zhí)行 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 擴(kuò)展
檢查 config.m4 中 Python 路徑是否正確。若 Python 的安裝路徑不是 /opt/anaconda3,需修改為正確的安裝路徑。
cd phpy phpize ./configure make install
安裝成功后,修改 php.ini ,加入 extension=phpy.so,執(zhí)行 php -m 和 php --ri phpy 檢查是否成功加載擴(kuò)展。
作為 Python 模塊
cmake . make -j
執(zhí)行成功后,會(huì)生成 tests/lib/phpy.so 文件??梢栽?nbsp;Python 中直接導(dǎo)入此模塊。
import phpy
使用方法
導(dǎo)入 Python 模塊
$os = PyCore::import('os');執(zhí)行函數(shù)
$uname = $os->uname();
讀取屬性
echo $uname->sysname;
加載路徑
可使用 PyCore::import('sys')->path->append() 將一些目錄加入到加載路徑列表中。
例如:/workspace/app/user.py 自定義的包,可以通過(guò)下面的步驟實(shí)現(xiàn)加載:
PyCore::import('sys')->path->append('/workspace')將/workspace添加到sys.path中PyCore::import('app.user')將自動(dòng)搜索sys.path找到對(duì)應(yīng)的app/user.py包并載入
內(nèi)置方法
PyCore::str()將對(duì)象轉(zhuǎn)為字符串PyCore::repr()PyCore::type()獲取對(duì)象的類型PyCore::locals()獲取當(dāng)前空間內(nèi)容的所有局部變量PyCore::globals()獲取所有全局變量PyCore::hash()獲取 Hash 值PyCore::hasattr()檢測(cè)對(duì)象是否存在某個(gè)屬性PyCore::id()獲取對(duì)象的內(nèi)部編號(hào)PyCore::len()獲取長(zhǎng)度PyCore::dir()獲取對(duì)象所有的屬性、方法PyCore::int()構(gòu)造一個(gè)整數(shù)PyCore::float()構(gòu)造一個(gè)浮點(diǎn)數(shù)PyCore::fn()構(gòu)造一個(gè)可調(diào)用函數(shù)PyCore::scalar()將PyObject對(duì)象轉(zhuǎn)為PHP的標(biāo)量類型,例如PyStr將轉(zhuǎn)為PHP 字符串,Dict/Tuple/Set/List將轉(zhuǎn)為Array
內(nèi)置類
PyObject:所有其他類型的基類PyDict:字典類型,等同于PHP的關(guān)聯(lián)數(shù)組PyList:列表類型,等同于PHP的索引數(shù)組PyTuple:元組,不可變的列表PyStr:字符串PyModule:Python包,PyModule也是PyObject的子類
PyObject 是除了 PyCore 之外,所有其他類型的基類。非內(nèi)置類的對(duì)象是 PyObject 的實(shí)例。PyObject 實(shí)現(xiàn)了 4 個(gè)魔術(shù)方法,用于將操作映射到 Python 對(duì)象。
所有類方法、參數(shù)、返回值參考 stubs 目錄中的文件。
繼承關(guān)系
PyObject -> PyModule
-> PySequenece -> PyList
-> PyTuple
-> PySet
-> PyStr
-> PyDict
-> PyType整數(shù)
Python 語(yǔ)言是天然支持無(wú)限精度整型計(jì)算的,可以使用 Python 的整數(shù)計(jì)算能力來(lái)代替 ext-bcmath
構(gòu)造
使用 PyCore::int() 函數(shù)來(lái)構(gòu)造一個(gè)數(shù)字,可以傳入整數(shù)、浮點(diǎn)數(shù)、字符串來(lái)初始化。
$i1 = PyCore::int(12345678);
$i2 = PyCore::int('1234567890123456789012345678901234567890');
$i3 = PyCore::int(12345678.03);運(yùn)算
整數(shù)同樣也是 PyObject 的實(shí)例,可以使用內(nèi)置的方法類實(shí)現(xiàn)運(yùn)算。
$i = PyCore::int(12345435); var_dump(strval($i->__pow__(3))); var_dump(strval($i->__add__(4)));
將輸出 1881564851360655187875 ,由于超過(guò)了 64位 最大精度,因此輸出結(jié)果將自動(dòng)轉(zhuǎn)為字符串類型。
命名參數(shù)
phpy 支持了命名參數(shù),可以使用命名參數(shù)來(lái)調(diào)用 Python 的函數(shù)和方法。
順序參數(shù)必須在前,命名參數(shù)必須在最后
kwargs($a, $b, $c, name: 'hello', world: 'rango');
對(duì)應(yīng)的 Python 代碼為:
kwargs(a, b, c, name: 'hello', world: 'rango')
回調(diào)函數(shù)
可將 PHP 的可調(diào)用對(duì)象作為 Python 的回調(diào)函數(shù)。使用 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導(dǎo)入了一個(gè)自定義Python包- 調(diào)用了包中的一個(gè)函數(shù)
test_callback,此函數(shù)接受一個(gè)參數(shù)為Python Callable對(duì)象 - 使用
PyCore::fn()包裹了一個(gè)Closure閉包對(duì)象作為回調(diào),這里也支持函數(shù)名稱字符串、對(duì)象方法的調(diào)用方式 - 回調(diào)函數(shù)返回了一個(gè)字符串,在
test_callback函數(shù)中會(huì)得到一個(gè)str類型返回值
可參考下方的 Python tkinter 例子。
實(shí)際案例
基于 tkinter 實(shí)現(xiàn) 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();
一個(gè)基于 transformers 的情感分析模型推理實(shí)現(xiàn)
<?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互調(diào)庫(kù)實(shí)現(xiàn)AI編程的詳細(xì)內(nèi)容,更多關(guān)于phpy PHP與Python互調(diào)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法
這篇文章主要介紹了php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法,實(shí)例分析了php操作視頻與圖像的相關(guān)技巧,需要的朋友可以參考下2016-05-05
PHP調(diào)用存儲(chǔ)過(guò)程返回值不一致問(wèn)題的解決方法分析
這篇文章主要介紹了PHP調(diào)用存儲(chǔ)過(guò)程返回值不一致問(wèn)題的解決方法,結(jié)合實(shí)例形式分析了存儲(chǔ)過(guò)程調(diào)用返回值不一致的原因與解決方法,需要的朋友可以參考下2016-04-04
session在php5.3中的變化 session_is_registered() is deprecated in
在php 5.3中session_is_registered()已經(jīng)是放棄使用了,大家在使用過(guò)程中需要注意一下了2013-11-11

