phpy 是識(shí)沃團(tuán)隊(duì)最新推出的開源項(xiàng)目,目標(biāo)是為PHP引入Python生態(tài),來彌補(bǔ)PHP生態(tài)的空缺和不足。phpy使得PHP可以調(diào)用所有Python的包。 包括當(dāng)下非常流行的PyTorch、transformers、TensorFlow等AI庫,以及Numpy、Pandas、Scikit等科學(xué)計(jì)算庫,還可以使用PyQt、wxPython等圖形界面庫。
不建議在php-fpm/apache短生命周期運(yùn)行環(huán)境下使用,頻繁地導(dǎo)入 / 銷毀模塊的開銷會(huì)消耗大量資源
編譯安裝
phpy可以作為PHP的擴(kuò)展,也可以作為Python的C模塊。既可以在PHP代碼中調(diào)用Python的庫,也可以在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工具來安裝
PHP 8.1或以上版本
Python將安裝到/opt/anaconda3目錄下
/opt/anaconda3/bin/pythonPython主程序
/opt/anaconda3/include/python3.11頭文件
/opt/anaconda3/lib/python3.11動(dòng)態(tài)鏈接庫目錄
另外需要配置/etc/ld.so.conf.d/conda.conf加入/opt/anaconda3/lib和/opt/php-8.1/lib。執(zhí)行l(wèi)dconfig檢查是否可以找到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文件??梢栽赑ython中直接導(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自定義的包,可以通過下面的步驟實(shí)現(xiàn)加載:
PyCore::import('sys')->path->append('/workspace')將/workspace添加到sys.path中
PyCore::import('app.user')將自動(dòng)搜索sys.path找到對應(yīng)的app/user.py包并載入
內(nèi)置方法
PyCore::str()將對象轉(zhuǎn)為字符串
PyCore::repr()
PyCore::type()獲取對象的類型
PyCore::locals()獲取當(dāng)前空間內(nèi)容的所有局部變量
PyCore::globals()獲取所有全局變量
PyCore::hash()獲取 Hash 值
PyCore::hasattr()檢測對象是否存在某個(gè)屬性
PyCore::id()獲取對象的內(nèi)部編號
PyCore::len()獲取長度
PyCore::dir()獲取對象所有的屬性、方法
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對象轉(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)置類的對象是PyObject的實(shí)例。PyObject實(shí)現(xiàn)了4個(gè)魔術(shù)方法,用于將操作映射到Python對象。 所有類方法、參數(shù)、返回值參考stubs目錄中的文件。
繼承關(guān)系
PyObject -> PyModule -> PySequenece -> PyList -> PyTuple -> PySet -> PyStr -> PyDict -> PyType
整數(shù)
Python語言是天然支持無限精度整型計(jì)算的,可以使用Python的整數(shù)計(jì)算能力來代替ext-bcmath
構(gòu)造
使用PyCore::int()函數(shù)來構(gòu)造一個(gè)數(shù)字,可以傳入整數(shù)、浮點(diǎn)數(shù)、字符串來初始化。
$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,由于超過了64位最大精度,因此輸出結(jié)果將自動(dòng)轉(zhuǎn)為字符串類型。
命名參數(shù)
phpy支持了命名參數(shù),可以使用命名參數(shù)來調(diào)用Python的函數(shù)和方法。 順序參數(shù)必須在前,命名參數(shù)必須在最后
kwargs($a, $b, $c, name: 'hello', world: 'rango');對應(yīng)的Python代碼為:
kwargs(a, b, c, name: 'hello', world: 'rango')
回調(diào)函數(shù)
可將PHP的可調(diào)用對象作為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對象
使用PyCore::fn()包裹了一個(gè)Closure閉包對象作為回調(diào),這里也支持函數(shù)名稱字符串、對象方法的調(diào)用方式
回調(diào)函數(shù)返回了一個(gè)字符串,在test_callback函數(shù)中會(huì)得到一個(gè)str類型返回值
可參考下方的Python tkinter例子。
實(shí)際案例
基于tkinter實(shí)現(xiàn)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();
一個(gè)基于transformers的情感分析模型推理實(shí)現(xiàn)
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));
-
AI
+關(guān)注
關(guān)注
87文章
34146瀏覽量
275297 -
開源
+關(guān)注
關(guān)注
3文章
3582瀏覽量
43459 -
編譯
+關(guān)注
關(guān)注
0文章
676瀏覽量
33740 -
python
+關(guān)注
關(guān)注
56文章
4823瀏覽量
86153 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11821
原文標(biāo)題:phpy:PHP與Python互調(diào)用庫,為PHP引入Python生態(tài)
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
為什么Python Web流行度不如PHP?
零基礎(chǔ)學(xué)編程,選PHP還是Python
如何用php調(diào)用mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改查
PHP與Python對比 如何選擇?
python代碼示例之基于Python的日歷api調(diào)用代碼實(shí)例

LabVIEW不同VI之間相互調(diào)用的詳細(xì)資料說明

PHP教程之PHP與MySQL數(shù)據(jù)庫連接的資料說明

使用Python實(shí)現(xiàn)身份證號碼歸屬地的數(shù)據(jù)庫調(diào)用代碼實(shí)例
Arduino庫直接調(diào)用沒有原庫復(fù)雜調(diào)用有用的數(shù)據(jù)
C代碼與javaScript函數(shù)的相互調(diào)用問題應(yīng)該如何解決
python讀取數(shù)據(jù)庫數(shù)據(jù) python查詢數(shù)據(jù)庫 python數(shù)據(jù)庫連接
Python環(huán)境搭建和LabVIEW中的調(diào)用

評論