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