Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
是下一個大事件嗎?如果繼續(xù)發(fā)展下去,有可能。
在 2022 年 PyCon 美國大會期間,作為主題演講嘉賓之一的 Peter Wang 公布了 PyScript,一種在 HTML 中直接編寫 Python 腳本的方法?;蛟S你不知道 Peter,但你可能聽說過 Anaconda,這是一種流行的開源的 Python 和 R 語言的發(fā)行版本,特別關(guān)注數(shù)據(jù)科學(xué)。Peter 正是 Anaconda 的 CEO 和聯(lián)合創(chuàng)始人。
換言之,PyScript 是由一家著名的科技公司開發(fā)的,這可能會保證它在不久的將來成為可行的方案。它在 Python 和 Web 開發(fā)者中受到了極大的關(guān)注,GitHub 上已有超過 10k 顆 Stars。然而,它是否能成為一個成功的、有競爭力的產(chǎn)品,取決于長期的時間和開發(fā)投入。目前,它還有一些已知的缺陷(將在最后討論)。
閑話少說,讓我們快速了解一下這個令人振奮的產(chǎn)品吧!
我們知道,HTML 文件是大多數(shù)網(wǎng)站最常見的元素。在創(chuàng)建網(wǎng)站時,我們的工作就是直接或間接地通過一些框架來編制 HTML 文件。在典型的 HTML 文件中,你會看到各種類型的標簽。例如,<head>定義了 HTML 頁面的元數(shù)據(jù)和關(guān)鍵信息,<title>是整個文檔的標題,而<h1>、<h2>等定義了不同級別的內(nèi)容標題。
如前所述,PyScript 允許你在 HTML 中編寫 Python 腳本,它使用一個特殊的標簽py-script。在這個標簽中,你可以嵌入 Python 腳本。要了解它是如何工作的,可以創(chuàng)建一個 HTML 文件,其中包含以下代碼,并使用 Chrome 瀏覽器打開該文件。在 Chrome 瀏覽器中,你應(yīng)該能夠看到類似下面這樣的內(nèi)容:
作者截圖
在上面的代碼片段中,你可能已經(jīng)注意到以下三個關(guān)鍵點:
這很酷,不是嗎?如果你不熟悉 Web 開發(fā),但了解 Python,就可以使用 PyScript 嵌入任何有效的 Python 代碼。讓我們再看一個例子。
另一個 PyScript 示例(圖片由作者提供)
在這里,我們寫了一些需要計算的代碼,可以看到,腳本得到了正確的執(zhí)行。
在編寫更復(fù)雜的代碼時,就需要使用第三方庫。在這種情況下,我們可以利用py-env標簽。你可能已經(jīng)猜到的,env 是 environment 的縮寫。py-env標簽中列出了運行代碼所需的 Python 包。
你可能知道,許多數(shù)據(jù)科學(xué)家都使用 pandas 進行數(shù)據(jù)處理工作。讓我們看看下面的例子。
使用包的 PyScript(圖片由作者提供)
如你所見,我們在py-env標簽中指定了依賴項(即 Pandas),該標簽包含在head標簽中。如果頁面需要多個依賴項,可以在這里把它們?nèi)苛谐觯?/span>
<py-env>
- pandas
- matplotlib
- numpy
</py-env>
復(fù)制代碼
如你所見,在py-script標簽中,我們確實可以使用 Pandas 庫來創(chuàng)建一個DataFrame對象。然而,當我們把打印出來時就會發(fā)現(xiàn),它是一個單行,而不是一個結(jié)構(gòu)化的數(shù)據(jù)表。沒有一個適當?shù)慕Y(jié)構(gòu),我們就無法理解這些數(shù)據(jù)。幸運的是,我們可以使用write函數(shù)(下文會討論)。
除了 Python 中的標準打印函數(shù)print,作為腳本的一部分,PyScript 有自己的write函數(shù),可以將數(shù)據(jù)發(fā)送到頁面上指定的 Web 元素中。請看下面的例子:
PyScript 寫函數(shù) write(圖片由作者提供)
與之前的例子相比,上述代碼片段有兩個重大變化:
write函數(shù)不僅能夠打印表格,還能夠打印數(shù)字。下面的例子向你展示了我們?nèi)绾问褂?/span>matplotlib(一個流行的 Python 包,用于數(shù)據(jù)可視化)來顯示由 Python 創(chuàng)建的圖。
PyScript 打印圖(圖片由作者提供)
如你所見,write 函數(shù)以期望的方式顯示了圖。
Python 學(xué)習的最好方法之一是使用 REPL:讀取(Read)、求值(Evaluate)、打?。≒rint)和循環(huán)(Loop)。也就是說,使用一個交互式的 Python 控制臺,輸入一些代碼,Python 對其進行求值并打印適當?shù)妮敵觯缓笾貜?fù)這個過程。Web 頁面也可以提供這樣的 REPL 環(huán)境,比如 Jupyter Notebook。
PyScript 可以使用py-repl標簽提供與此類似的東西。在這個元素中,你可以讓用戶自己編寫代碼,也可以以編程方式輸入代碼。請看下面的例子:
PyScript REPL(圖片由作者提供)
如你所見,上圖中有一個單元格,其中包括在py-repl標簽中指定的代碼。值得注意的是,單元格中的代碼可以引用我們之前在py-script標簽中定義的變量。一切看起來都很協(xié)調(diào)。
本文介紹的內(nèi)容是現(xiàn)階段 PyScript 所能提供的主要亮點。它似乎是一個很有前途的產(chǎn)品,因為它提供了一個靈活的框架,讓 Python 程序員可以在沒有太多 Web 開發(fā)知識的情況下創(chuàng)建 Web 應(yīng)用。然而,也有其他類似的成功的產(chǎn)品,因此,競爭會很激烈。
例如,如果我需要為自己的數(shù)據(jù)科學(xué)項目創(chuàng)建一個 Web 應(yīng)用,我就會直接使用 Streamlit。它的功能已經(jīng)相對成熟。請注意,雖然都與 Web 開發(fā)有關(guān),但 PyScript 和 Streamlit 屬于不同的產(chǎn)品系。PyScript 應(yīng)該更通用,因為它的目標是讓你可以在任何網(wǎng)頁上嵌入任何 Python 代碼,Streamlit 做不到這一點。
在 PyScript 為更多的人所接受之前,它有幾個問題必須解決。例如,Web 頁面的加載速度非常慢。如果你嘗試跟隨本教程運行代碼,可能就會注意到,在 Web 頁面的顯示會有一個明顯的滯后。
盡管如此,我還是覺得這個產(chǎn)品會繼續(xù)發(fā)展,我的信心主要來自于它的開發(fā)者——給我們帶來極好的 Anaconda 工具的 Anaconda 團隊。
本文最初發(fā)布于 Better Programming。
查看英文原文:Running Python Scripts on the Web Using PyScript
了解更多軟件開發(fā)與相關(guān)領(lǐng)域知識,點擊訪問 InfoQ 官網(wǎng):https://www.infoq.cn/,獲取更多精彩內(nèi)容!
者:劉早起
來源:早起Python
如何在線執(zhí)行 pandas 代碼感興趣,今天就簡單來說一下我探索這一功能的過程。
首先在設(shè)計這一功能時,需要先明確大致需求:
其中最重要的一點就是用戶可以在當前網(wǎng)站、當前單元格執(zhí)行代碼,其次盡可能的減少其他操作。
其實為了實現(xiàn)這個功能,我探索了大半個月,不斷修改方案,刪掉了幾個寫了很久但是不能完美實現(xiàn)的代碼,幾度放棄,最后還是磕磕碰碰的做出來,下面是我的一些經(jīng)驗,僅供參考。
首先最簡單的思路就是用自己的服務(wù)器,前端寫一個輸入框,然后將用戶提交的代碼到后臺,執(zhí)行后再返回前端,就像這樣
但是思索了一番還是放棄了,除了要防止惡意用戶執(zhí)行sudo rm - rf /*之類的代碼,為了滿足第二個需求就要給每個用戶分配一定的空間,這就很吃服務(wù)器的配置,例如前天最高100+用戶同時運行,我的 4c8g 服務(wù)器肯定是帶不動的。
并且如果采取這個的方案,理論上可以實現(xiàn),但除了升級服務(wù)器要錢,我也沒有開發(fā)類似產(chǎn)品的經(jīng)驗,時間成本不好預(yù)估,遂放棄。
之后又是一番面向 stackoverflow 編程,我了解到很多可以在線執(zhí)行代碼的網(wǎng)站,就像這樣
確實可以在線執(zhí)行一段代碼,但是除去我是否能做出來,如何控制權(quán)限等問題,這樣的網(wǎng)站主要是以執(zhí)行代碼為主,無法完成 pandas 教程的任務(wù)。
并且代碼不能預(yù)設(shè)置,只能進入頁面后手動輸入,本地數(shù)據(jù)也不好加載,而且執(zhí)行一次就要跳轉(zhuǎn)到一個新的頁面,十分繁瑣(寫一個爬蟲接口也是一個辦法,但是就太依賴對方網(wǎng)站),于是很快放棄了這條思路。
繼續(xù)一番搜索后,我發(fā)現(xiàn)了一個神器 —— Jupyterhub
如上圖架構(gòu)展示的一樣,使用Jupyterhub 可以給每個用戶分配一個獨立的Jupyter Notebook,并且無需考慮權(quán)限等問題,我也可以提前將代碼和數(shù)據(jù)進行預(yù)設(shè)。
但問題在于采取此方案無法滿足教程需求,因為全部內(nèi)容都需要放在 Jupyter Notebook中,整體上就是將 pandas300題做成了在線版,而我想要的是一個網(wǎng)站。
并且使用Jupyterhub不可避免的要進行一些 docker 或 k8s 操作,這也不是我熟悉的領(lǐng)域,雖熱在這條思路上走了一段時間,但還是放棄了。
之后又是一番檢索,但無非都是上面幾種方案,在我感覺要放棄做這個網(wǎng)站時,無意中發(fā)現(xiàn)一個項目JupyterBook
簡單來說,他可以將你的 Jupyter Notebook 轉(zhuǎn)換為 html 頁面(基于 sphinx),并且一個很重要的特點就是可以在線、交互式執(zhí)行代碼。
具體怎么實現(xiàn)的呢?首先需要將你的項目上傳到一個公共資源平臺binder,這個網(wǎng)站會為你的項目創(chuàng)建一個鏡像,這樣可以方便給不同用戶使用
簡單來說,可以理解為將你的 Jupyter Notebook 掛在這個網(wǎng)站,別人就能去在線執(zhí)行,但是很明顯,我們都需要跳轉(zhuǎn)到這個頁面去使用,而我希望在當前頁面執(zhí)行代碼。
這時就需要在使用另一個項目(Thebe)
它使用JupyterLab API,通過加載一段JS代碼,再指定一個執(zhí)行后端(上面提到的binder),就可以在當前頁面執(zhí)行代碼。
聽起來很復(fù)雜,但是實現(xiàn)起來很簡單,上面我們說到,JupyterBook 是基于 Sphinx制作頁面的,所以只需要提前在配置 Sphinx時加載 sphinx_thebe插件即可,
至此,開頭我需求中的1、2就完美實現(xiàn)了,還剩最后一個問題就是如何讓用戶更少的執(zhí)行代碼?
如果你體驗過我的網(wǎng)站,你會發(fā)現(xiàn)執(zhí)行一個 pandas 操作連 import pandas as pd和讀取數(shù)據(jù)的操作都不用!
其實這些代碼在啟動jupyter notebook時就預(yù)先加載了,只需要在對應(yīng)單元格上加上 thebe-init的 tag 即可。
當然,使用 JupyterBook 還是有很多坑,消耗我最多的時間就是在修改樣式上,默認的樣式如下,可能英文狀態(tài)下表現(xiàn)還行,但是到中文并不是很適配
為了大家不僅用的爽,我對網(wǎng)站顏值的要求也很高,于是爆改了幾千行的 css 和 js 代碼,甚至組件的位置都調(diào)整到小數(shù)點后兩位才讓我滿意,磕磕碰碰一個多月終于將整個網(wǎng)站做出來
最后,本文僅是對在線執(zhí)行代碼做了一個快速、不完整的總結(jié)。由于篇幅限制,還有很多搭建、部署網(wǎng)站細節(jié)的內(nèi)容沒有涉及到,如果你覺得不錯,歡迎點贊、轉(zhuǎn)發(fā)。
器之心報道
項目作者:vinayak mehta參與:一鳴
從 PDF 表格中獲取數(shù)據(jù)是一項痛苦的工作。不久前,一位開發(fā)者提供了一個名為 Camelot 的工具,使用三行代碼就能從 PDF 文件中提取表格數(shù)據(jù)。
PDF 文件是一種非常常用的文件格式,通常用于正式的電子版文件。它能夠很好的將不同的排版格式固定下來,形成版面清晰且美觀的展示效果。然而,對于想要從 PDF 中提取信息的人們來說,PDF 是個噩夢,尤其是表格。
大量的學(xué)術(shù)報告、論文、分析文章都使用 PDF 展示其中的表格數(shù)據(jù),但是對于如果想要直接從表格中復(fù)制數(shù)據(jù)則會非常麻煩。不久前,有一位開發(fā)者提供了一個可從文字 PDF 中提取表格信息的工具——Camelot,能夠直接將大部分表格轉(zhuǎn)換為 Pandas 的 Dataframe。
Camelot 是什么
據(jù)項目介紹稱,Camelot 是一個 Python 工具,用于將 PDF 文件中的表格數(shù)據(jù)提取出來。
具體而言,用戶可以像使用 Pandas 那樣打開 PDF 文件,然后利用這個工具提取表格數(shù)據(jù),最后再指定輸出的形式(如 csv 文件)。
代碼示例
項目提供的 PDF 文件如圖所示,假設(shè)用戶需要提取這些文字之間的表格 2-1 中的信息。
PDF 文件。我們需要提取表格 2-1。
使用 Camelot 提取表格數(shù)據(jù)的代碼如下:
>>> import camelot >>> tables = camelot.read_pdf('foo.pdf') #類似于Pandas打開CSV文件的形式 >>> tables[0].df # get a pandas DataFrame! >>> tables.export('foo.csv', f='csv', compress=True) # json, excel, html, sqlite,可指定輸出格式 >>> tables[0].to_csv('foo.csv') # to_json, to_excel, to_html, to_sqlite, 導(dǎo)出數(shù)據(jù)為文件 >>> tables <TableList n=1> >>> tables[0] <Table shape=(7, 7)> # 獲得輸出的格式 >>> tables[0].parsing_report { 'accuracy': 99.02, 'whitespace': 12.24, 'order': 1, 'page': 1 }
以下為輸出的結(jié)果,對于合并的單元格,Camelot 在抽取后做了空行處理,這是一個穩(wěn)妥的方法。
安裝方法
項目作者提供了三種安裝方法。首先,你可以使用 Conda 進行安裝,這是最簡單的。
conda install -c conda-forge camelot-py
最流行的安裝方法是使用 pip 安裝。
pip install camelot-py[cv]
還可以從項目中克隆代碼,并使用源碼安裝。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。