<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

phpy:PHP與Python互調用庫

OSC開源社區 ? 來源:OSC開源社區 ? 2023-12-12 10:43 ? 次閱讀

phpy 是識沃團隊最新推出的開源項目,目標是為PHP引入Python生態,來彌補PHP生態的空缺和不足。phpy使得PHP可以調用所有Python的包。 包括當下非常流行的PyTorch、transformers、TensorFlowAI庫,以及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文件??梢栽赑ython中直接導入此模塊。
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

    文章

    26679

    瀏覽量

    264337
  • 開源
    +關注

    關注

    3

    文章

    3002

    瀏覽量

    41750
  • 編譯
    +關注

    關注

    0

    文章

    622

    瀏覽量

    32417
  • python
    +關注

    關注

    52

    文章

    4691

    瀏覽量

    83526
  • 回調函數
    +關注

    關注

    0

    文章

    87

    瀏覽量

    11465

原文標題: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 ?4438次閱讀

    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 ?2917次閱讀
    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 ?858次閱讀
    <b class='flag-5'>Python</b>環境搭建和LabVIEW中的<b class='flag-5'>調用</b>

    python調用windows命令

    Python是一種強大的編程語言,可以用于開發各種不同類型的應用程序。其中一個常見的用途是使用Python調用Windows命令來執行特定的任務。在本文中,我們將詳細討論如何使用Python
    的頭像 發表于 11-29 14:34 ?497次閱讀

    phppython一樣嗎

    PHPPython是兩種不同的編程語言,盡管它們都用于開發Web應用程序,但它們有許多不同之處。從語法、用途、社區到性能和生態系統等方面來講,PHPPython在許多方面都有不同之
    的頭像 發表于 12-04 15:47 ?522次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>