Python

實時日誌輸出:解決Docker容器中Python日誌延遲的簡易方法!

在Docker容器中部署Python應用程序時,你可能會遇到一個令人困擾的問題:日誌輸出有延遲,導致日誌信息不是實時顯示的。這種情況下,你無法立即查看應用程序的運行狀態,也不方便調試問題。然而,幸運的是,我們有一個簡單的方法可以解決這個問題。 問題原因: 默認情況下,Python的標準輸出和標準錯誤輸出會被緩衝,而不是實時輸出到終端或日誌文件中。這就導致了在Docker容器中運行Python應用程序時,日誌信息會積累一段時間後才一次性輸出,造成延遲顯示的現象。 解決方法: 要解決這個問題,我們只需在運行Python腳本時,在Python解釋器命令中加入-u選項即可。這個選項的作用是取消緩衝,使得日誌信息能夠實時輸出,而不需要等待緩衝區填滿或應用程序結束。 使用示例: 假設我們有一個名為app.py的Python腳本,內容如下: 在Docker容器中運行這個腳本時,我們可以這樣做: 解釋: 在上述命令中,我們使用了Python 3的官方鏡像,並在容器中運行了app.py腳本。通過加入-u選項,我們解決了日誌延遲顯示的問題,現在日誌信息將會實時顯示在終端中。 結語: 通過在運行Python腳本時加入-u選項,我們能夠簡單高效地解決Docker容器中Python日誌延遲顯示的問題。這個小技巧讓我們更輕鬆地監控和調試Python應用程序,提高了開發和運維的便利性。希望這個方法對你在Docker容器中部署Python應用程序時有所幫助!

Node js 里有沒有像selenium類似的framework?

在Node.js中,有一個類似於Selenium的自動化測試框架叫做Puppeteer。Puppeteer是一個由Google開發的Node.js庫,提供了一個API來控制和操作瀏覽器。它可以用於模擬用戶行為、進行頁面導航、執行JavaScript、提取數據等等。 Puppeteer具有以下特點: 可以通過無頭模式運行,即在沒有界面的情況下運行瀏覽器操作。 可以與Chrome瀏覽器無縫集成。 支持對頁面進行截圖和PDF生成。 允許模擬鍵盤和鼠標輸入。 可以進行頁面自動化測試和爬蟲等任務。 你可以使用Puppeteer來實現類似於Selenium的自動化測試和瀏覽器操作。它提供了豐富的API,使得控制和操作瀏覽器變得非常方便。你可以使用Puppeteer來加載網頁、填寫表單、點擊按鈕、抓取數據等等操作。 要開始使用Puppeteer,你需要先安裝它。可以使用npm(Node.js的包管理器)來安裝Puppeteer。在命令行中運行以下命令: 安裝完成後,你可以在Node.js腳本中引入Puppeteer並開始使用它。以下是一個簡單的示例,展示了如何使用Puppeteer來打開網頁並截取頁面截圖: 這段代碼會啟動一個無頭Chrome瀏覽器實例,創建一個新的頁面,然後導航到指定的網址,並最後保存頁面截圖為example.png。 這只是Puppeteer的一個簡單示例,它還有很多功能和API可以探索。你可以查閱Puppeteer的官方文檔來了解更多信息和示例:https://pptr.dev/

用python給文件生成bloom filter

bloom filter是什麼? Bloom filter(布隆過濾器)是一種概率型數據結構,用於判斷一個元素是否屬於一個集合,具有高效的插入和查詢操作。它可以快速告訴你某個元素“可能存在”或“一定不存在”於一個集合中,但無法確定元素的確切存在與否。 Bloom filter 由布隆提出並在1970年發表,它基於哈希函數的應用。它的核心是一個位數組(bit array)和一組哈希函數。位數組用於表示集合,初始時所有的位都被置為0。哈希函數用於將元素映射為位數組的索引,並將對應位置的位設置為1。 插入元素時,通過對元素應用一組哈希函數,可以得到多個位數組索引,然後將這些索引對應的位設置為1。查詢元素時,同樣對元素應用哈希函數,得到相應的位數組索引,如果所有的索引位置的位都為1,則說明元素“可能存在”於集合中;如果任何一個索引位置的位為0,則可以確定元素“一定不存在”於集合中。 由於使用了多個哈希函數和位數組,Bloom filter 具有較低的內存佔用和快速的查詢速度。然而,它也存在一定的誤判率(false positive),即在判斷元素存在時可能會出現錯誤判斷。這是因為不同元素的哈希函數映射到位數組時可能產生衝突,導致位數組的某些位置同時被設置為1,從而影響判斷結果。 Bloom filter 主要應用於那些對查詢速度要求較高、可以容忍一定的誤判率的場景,例如網絡緩存、大規模數據集的去重、垃圾郵件過濾等。通過適當調整位數組大小和哈希函數的數量,可以在一定程度上控制誤判率和內存佔用。 bloom filter 和 hash function有什麼不同? Bloom filter(布隆過濾器)和哈希函數在使用方式和目的上有一些不同之處: 目的:Bloom filter 的主要目的是判斷一個元素是否屬於一個集合,它提供了一種快速的判斷方式,可以告訴你元素“可能存在”或“一定不存在”於集合中。而哈希函數的主要目的是將數據映射為較短的固定長度值,常用於加密、數據唯一性校驗、散列查找等方面。 數據結構:Bloom filter 是一種概率型數據結構,它由一個位數組(bit array)和一組哈希函數組成。位數組用於表示集合,哈希函數用於將元素映射到位數組的索引。哈希函數通常是不可逆的,將輸入映射到固定長度的輸出。而哈希函數本身並不包含數據結構,它只是一個單獨的函數。 功能:Bloom filter 用於判斷元素是否屬於一個集合,具有高效的插入和查詢操作。它可以給出“可能存在”或“一定不存在”的答案,但無法確定元素的確切存在與否。哈希函數則是將數據進行轉換和計算,通常用於唯一標識、散列查找、數據完整性校驗等。 衝突和誤判:Bloom filter 可能存在哈希衝突,即不同元素經過哈希函數計算後映射到相同的位數組位置,這可能導致誤判。而哈希函數應該盡量避免衝突,以確保在不同的輸入上產生不同的輸出,但在實際應用中,哈希衝突是難以完全避免的。 總的來說,Bloom filter 是基於哈希函數的一種數據結構,它利用哈希函數將元素映射到位數組,並通過多次哈希映射來提供快速的元素判斷。哈希函數則是獨立的計算函數,用於將數據映射為固定長度的值,常用於唯一標識、散列查找、數據完整性校驗等場景。 用Python給文件生成bloom…
Read more

怎樣計算cosine similarity? Python實例

1 使用Tensorflow / Keras Keras提供的loss function有cosine similarity 輸出結果 需要注意的是,Keras算出來的結果是負的。因為它是作為一種loss function,如果2個向量越相似,他們越接近1,所以loss越小,那麼Keras就把一般意義上的Consine similarity加了個負號。 2 只使用Raw Python 只用Raw Python寫個函數也不難,代碼如下 輸出結果 這樣就沒有負數問題了。

舊金山灣區時間與北京時間轉換,用python實現時區轉換例子

San Francisco Time ?? Beijing Time ?? 把一個時區的時間,比如灣區9:00am,轉換成另一個時區的時間,比如北京/香港/新加坡時間,應該是很簡單的問題。用Python做時區轉換好像挺麻煩的,容易出錯。Google出來的前幾條結果都不是很讓人滿意,本文總結我測試過可靠可行不太複雜的方法,以及一些容易出錯的地方。 先上可行的Python例子,把三藩(SF)灣區時間9am, 轉換成對應的北京時間,用了datetime和pytz。先構造一個灣區時間的對象,然後轉化成北京/香港/新加坡時間。 加上註解和debug信息。 可以看到建立的灣區時間時區為-0700而北京時間為0800,可以驗證灣區和中國時差為15小時。 時區行話解釋 全球標準時間用的是位於英國的格林威治時間(GMT, Greenwich Mean Time)。因為以前格林威治天文台是世界中心,本初子午線或者0度經線就定義為穿過它的經線。然後又有了一個叫世界協調時間的東西(UTC, Coordinated Universal Time)。這個和GMT基本一致,大概就是北京話和普通話的區別吧。北京在Greenwich的東邊,時間領先GMT/UTC 8小時,所以叫東八區,代號0800。而灣區在格林威治的西邊,時間滯後7個小時(美國國會通過了永久使用夏令時法案),所以叫西7區,代號-0700。而兩地時差為7+9=15,北京時間比灣區時間領先15個小時。 同理,日本和韓國位於東9區,代號為0900,那麼時間就比為與東八區的中國早1小時。 當地真實時間和約定標準時間 一個地方的真實時間只取決於太陽相對當地的位置,也就是取決於當地經度。但是為了方便,每個國家可以人為規定用什麼時間。比如整個中國雖然跨了幾個緯度,確人為規定了各地都使用北京時間。新加坡真實時間應該為0655,確規定使用0800,也許是和大中華區保持一致比較方便。 回到Python上,這也正是pytz包的一些坑的來源。pytz用的是地理意義上的真實時間,而人們真正使用的是當地法律約定的時間,這兩者是有差別的。 Python datetime不設時區是什麼時間? 如果新建一個datetime對象,不設時區的話,會是當地時間。 用epochconverter轉換1656658800.0,正是灣區時間2022-07-01 00:00:00 如果replace了timezone,就把底下的timestamp變了,而不是保持timestamp而改變時間表示形式(日期,小時/分/秒)。所以replace(tzinfo=…)並不是做時區變換。而且注意下面例子里上海時間是0806,並不是0800,應該用了地理意義上的真實時間而不是法定時間。這個地理時間在生活中基本沒用,這個pytz的坑之一。 參考 Python3中datetime時區轉換介紹與踩坑 python datetime時區轉換 技巧:用datetime模塊處理時區轉換,不要用time模塊 將UTC、EST時區的時間轉化成北京時間(python) pytz庫時區的坑(轉) The Solution…
Read more

Python Pathlib生存手冊,幾個短例子極速上手

Pathlib是Python里自帶的處理OS路徑的library,功能非常強大,可以代替原來的os.path。本文提供幾個簡單的例子供查詢,幫您極速上手,引用到自己的python project里。 創建操作Path對象例子 可以用”/“直接得到下一層目錄或文件的Path對象 Home Path對象例子 需要注意的是,Path constructor的參數不認識~。需要用Path.home()。 驗證tilda不work 驗證Path.home() work 當前目錄例子 如果需要當前目錄的對象可以用cwd函數或者.加resolve函數 遍歷文件夾例子 也就是implement bash命令 用pathlib實現如下 外面函數python_find接受path string,裡面的遞歸函數_python_find接受pathlib.Path object。用iterdir列出當前input path下的所有對象,先打印它們的路徑,如果是目錄,就繼續調用遞歸函數_python_find打印下一層目錄裡面的內容。 Pathlib刪除文件例子 刪除文件 刪除目錄/文件夾 rmdir只能刪除空的文件夾/目錄,如果內部還有其他文件或目錄會報錯。 刪除非空目錄/文件夾 這個只能自己用上面兩個函數用遞歸實現。這裡我增加了顯示被刪除文件size的信息。 參考 一分鐘學一個 Python 標準庫之 Pathlib PathLib recursively remove directory? pathlib — Object-oriented filesystem paths…
Read more

安裝IBKR python API

到IB官網下載最新API,選Software: TWS API,然後”I Agree” License aggreement。然後選平台,比如TWS API Latest for Mac / Unix。 cd 到下載地址。 根據README.md里說的 具體版本可能有點不一樣。我安裝的時候README.md里的版本有點過時,不是下載的現有版本。 安裝完成後就可以讀User’s Guide了。