本文目錄一覽:
- 1、windows環境的python踩坑記
- 2、關於c調python.h的坑
- 3、夜曲編程的python坑
- 4、python編程遇到的幾個坑
- 5、用python操作excel數據之避坑秘技
- 6、Python分佈式進程中你會遇到的坑
windows環境的python踩坑記
雖然使用python有不少時間了,但是基本沒有在windows環境下使用,這不就踩了不少坑,特此記錄如下:
安裝完成後,發現沒有python命令,這個是環境變量的問題,添加就可以了。但是也找不到pip 命令,而進入python裏面,可以import pip 模塊。這時候,需要用 「python -m ensurepip 」 來生成pip命令了,生成之後添加到環境變量就可以直接使用了, 默認情況下pip的路徑: Python_install_path\scripts\pip.exe , 在較新的python版本裏面,已經默認會生成pip 命令,也就是說不需要上述步驟就有pip 命令可以使用了.需要注意的是:
如果遇到執行pip.exe 時候報錯: Fatal error in launcher: Unable to create process using ‘”‘ , 那麼可以嘗試用: python FULL/PATH/OF/PIP/COMMAND 來替帶直接運行 pip, 貌似是無法找到合適的解釋器來運行pip造成的.
如果發現系統中已經安裝了python,但是缺少需要的module, 需要自己安裝,可是不是管理員權限,沒辦法安裝,python 提供了解決辦法,方法如下:
A.
使用python -m site 命令,該命令會輸出python的sys.path變量的值,以及其他的變量,見如下內容,其中我們可以看到有兩個變量:USER_BASE, USER_SITE. 我們可以把需要的module 安裝到USER_SITE下.
如果不存在相應的路徑,那麼我們可以創建.
B.
有了上述的路徑後,我們在安裝3rd module 的時候,就可以指定安裝路徑了:
pip install MODULE_FILE.PY –target=ABOVE\USER_SITE\PATH
上述方式安裝之後,只有當前用戶可以使用這些新裝的module, 其他用戶是不可以的.
其實這個不能算windows平台的坑了,一般不能import 都是缺少依賴的問題。 那麼我們可以返回pip 命令,首先要知道這個module 的路徑,通過路徑中其他的信息確認這個module所屬的package.
關於c調python.h的坑
python.h是基於python-devel的開發包,比如你要用到c調用python去執行一些任務,這個時候python.h就是你的好幫手。在我所理解一般用它都有兩個場景:
1. 藉助語言優勢解決問題;
2. 簡化開發難度,偷懶;
在我這,我用它的主要目的在於加入掃描框架的依賴,畢竟lua的學習成本挺高的,如果正好這個安全人員不懂lua,只懂python咋整?能不成讓他學習lua么?成本是一個方面,更多的是怎麼快起來。一個團隊,在快節奏下才能成長起來。
正好手上有一台機器,別人給我用來測試玩的,我就拿來做些調試和環境的測試。還沒到生產環境,就遇到不少的坑,當時在線上環境也有測試,陪着運維的小哥一起搞,不斷的測試和調整,折騰到很晚才搞成功,這裡記錄下過程。
默認的情況下,python.h應該在這個位置,但是測試的結果說找不到。內心是崩潰的,我在mac下是正常的。
用find命令找當前系統中的python.h的版本,發現只有2.6的,但是我按照了python2.7,這個版本完全錯亂了。
心想,坑啊~~ 為了解決問題,少不得需要重新編譯之類的屁事,當然,我們也幹了這事,最後發現仍然不行,參考的例子(知乎上的指引,坑b)如下:
首先,你需要先把所有的python環境卸載,然後安裝同步的環境,比如python2.7.12,devel也是python2.7.12,還有就是libs也必須是,不然弄不了,另外,編譯安裝默認不靠譜,最好就是rpm的方式來。包我留下,有需要的玩。
這是我的解決方案,當前完美解決我的問題,另外,推薦大家按照這個方式來搞,特別在centos環境下,這個比較坑爹。
夜曲編程的python坑
不坑。
夜曲編程就初學者入門而言是很不錯的,主要有幾個優勢:課程設計:總體設計由淺入深,學習路徑清晰,容易堅持。採用的是卡片模式,每日學習一課,只需花費20來分鐘。且頁面自帶記憶卡片,複雜概念簡單化。
偶然在網上發現了夜曲編程這個軟件。試着跟着學了一下,先是學習的免費課程。第一次學習的時候,這個教程驚艷了我。首先,夜曲編程的教程都是圖文形式的教程,交互式的教學方法讓學習的效率有了很大的提高。夜曲編程出自百詞斬旗下,它通過卡片的形式將一些編程的知識點放入其中,一定程度上可以增進編程的學習效果。
python編程遇到的幾個坑
1. 爬個別特定網站,不一定得用python寫爬蟲,多數情況wget一條命令多數網站就能爬的不錯,真的玩到自己寫爬蟲了,最終遇到的無非是如何做大做壯,怎麼做分佈式爬蟲。scrapy這種價值接近0,異步或者多線程搞抓取,選一個成熟的基於磁盤的隊列庫,kafka之類的,scrapy幫了啥?
2. http庫眾多,還有gevent庫monkey patch以後coroutine的玩這一選擇,規模千萬的話urllib3很好。
3. 對付網站的諸如登錄、ajax,這種不過是體力民工活,不展開了。
4. 速度很重要,放ec2或者國內的雲上跑,很重要的指標是你每一億網頁爬下來成本多少,爬的時候比如4核一個虛擬機節點,你能inbound貸款用足100mbps嗎。
5. beautifulsoup太慢,全網的爬,encoding的分析也要要快,c實現的chardet還行
最關鍵的,永遠是爬下來以後的信息的提取、分析、使用,就是另外一個話題了。
1.學會使用chrome瀏覽器查看通信以及查看元素格式
2.增加User-Agent, 這是最簡單的反爬措施了
3.寫爬蟲最好使用Ipython,在交互式的環境下,可以時刻了解自己問題具體出在哪裡
4.使用requests
5.用get或者post下好html之後,要確認你需要的東西html裏面有,而不是之後用ajax或者javascript加載的。
6.解析的話,BeautifulSoup不錯。對於少數非常特殊的,可以考慮用re。
7,需要大量採集數據的話,學會使用框架,比如scrapy。
進階:
加入網站需要模擬登陸,裏面使用了很多ajax或者javascript,或者反爬蟲厲害,用requests的session,注意F12查看到底發送了什麼數據。
實在不會,就使用模擬瀏覽器吧,推薦selenium,雖然速度慢點,內存多點,但是真的很省力,而且基本查不出來。
最後,爬蟲速度不要太快,加上time.sleep(1),盡量少用多線程,別人建站也不容易,(尤其是小站)你不給別人帶來很大的麻煩,別人也就睜一隻眼閉一隻眼了,否則封IP不是好玩的。
有些頁面喜歡使用redirect,然而requests的get和post方法中默認是直接跳轉的!很可能你就帶着錯誤的cookies和headers跳轉了,所以務必將allow_redirects參數設為false
用python操作excel數據之避坑秘技
用python操作excel表裡的數據非常方便,可以把不同報表,不同類型的數據各種乾坤大挪移,彙集到一起進行展示。但初學者可能會遇到一些大坑,百思不得其解,而不得不放棄這個神器。現把我在自學過程中遇到的一些坑與大家分享,給初學者參考,歡迎批評指正!
坑一:用pandas的to_excel寫入EXCEL時,會把原數據清空。
解決方案:先用openpyxl的load_workbook打開工作薄,再用pandas的ExcelWriter新建寫入器,把之前打開的工作薄賦值給寫入器的工作薄。
坑二:把帶有公式的sheet1數據導入再寫入sheet2時,會發現帶公式的數據全部為空。
解決方案:可用win32com.client中的Dispatch把EXCEL表打開再保存。
坑三:當把複製文件,新建文件,打開保存文件,數據寫入都寫在一個程序時,往往由於EXCEL打開保存時間較長而與後續程序衝突報錯。
解決方案:每個環節建模塊順序執行,各環節間用time.sleep隔開。
Python分佈式進程中你會遇到的坑
寫在前面
小驚大怪
你是不是在用Python3或者在windows系統上編程?最重要的是你對進程和線程不是很清楚?那麼恭喜你,在python分佈式進程中,會有坑等着你去挖。。。(hahahaha,此處允許我嚇唬一下你)開玩笑的啦,不過,如果你知道序列中不支持匿名函數,那這個坑就和你say byebye了。好了話不多數,直接進入正題。
分佈式進程
正如大家所知道的Process比Thread更穩定,而且Process可以分佈到多台機器上,而Thread最多只能分佈到同一台機器的多個CPU上。Python的multiprocessing模塊不但支持多進程,其中managers子模塊還支持把多進程分佈到多台機器上。一個服務進程可以作為調度者,將任務分佈到其他多個進程中,依靠網絡通信。由於managers模塊封裝很好,不必了解網絡通信的細節,就可以很容易地編寫分佈式多進程程序。
代碼記錄
舉個例子
如果我們已經有一個通過Queue通信的多進程程序在同一台機器上運行,現在,由於處理任務的進程任務繁重,希望把發送任務的進程和處理任務的進程分佈到兩台機器上,這應該怎麼用分佈式進程來實現呢?你已經知道了原有的Queue可以繼續使用,而且通過managers模塊把Queue通過網絡暴露出去,就可以讓其他機器的進程來訪問Queue了。好,那我們就這麼干!
寫個task_master.py
我們先看服務進程。服務進程負責啟動Queue,把Queue註冊到網絡上,然後往Queue裏面寫入任務。
請注意,當我們在一台機器上寫多進程程序時,創建的Queue可以直接拿來用,但是,在分佈式多進程環境下,添加任務到Queue不可以直接對原始的task_queue進行操作,那樣就繞過了QueueManager的封裝,必須通過manager.get_task_queue()獲得的Queue接口添加。然後,在另一台機器上啟動任務進程(本機上啟動也可以)
寫個task_worker.py
任務進程要通過網絡連接到服務進程,所以要指定服務進程的IP。
運行結果
現在,可以試試分佈式進程的工作效果了。先啟動task_master.py服務進程:
task_master.py進程發送完任務後,開始等待result隊列的結果。現在啟動task_worker.py進程:
看到沒,結果都出錯了,我們好好分析一下到底哪出錯了。。。
錯誤分析
在task_master.py的報錯提示中,我們知道它說lambda錯誤,這是因為序列化不支持匿名函數,所以我們得修改代碼,重新對queue用QueueManager進行封裝放到網絡中。
其中task_queue和result_queue是兩個隊列,分別存放任務和結果。它們用來進行進程間通信,交換對象。
因為是分佈式的環境,放入queue中的數據需要等待Workers機器運算處理後再進行讀取,這樣就需要對queue用QueueManager進行封裝放到網絡中,這是通過上面的2行代碼來實現的。我們給return_task_queue的網絡調用接口取了一個名get_task_queue,而return_result_queue的名字是get_result_queue,方便區分對哪個queue進行操作。task.put(n)即是對task_queue進行寫入數據,相當於分配任務。而result.get()即是等待workers機器處理後返回的結果。
值得注意 在windows系統中你必須要寫IP地址,而其他操作系統比如linux操作系統則就不要了。
修改後的代碼
在task_master.py中修改如下:
在task_worker.py中修改如下:
先運行task_master.py,然後再運行task_worker.py
(1)task_master.py運行結果如下
(2)task_worker.py運行結果如下
知識補充
這個簡單的Master/Worker模型有什麼用?其實這就是一個簡單但真正的分佈式計算,把代碼稍加改造,啟動多個worker,就可以把任務分佈到幾台甚至幾十台機器上,比如把計算n*n的代碼換成發送郵件,就實現了郵件隊列的異步發送。
Queue對象存儲在哪?注意到task_worker.py中根本沒有創建Queue的代碼,所以,Queue對象存儲在task_master.py進程中:
而Queue之所以能通過網絡訪問,就是通過QueueManager實現的。由於QueueManager管理的不止一個Queue,所以,要給每個Queue的網絡調用接口起個名字,比如get_task_queue。task_worker這裡的QueueManager註冊的名字必須和task_manager中的一樣。對比上面的例子,可以看出Queue對象從另一個進程通過網絡傳遞了過來。只不過這裡的傳遞和網絡通信由QueueManager完成。
authkey有什麼用?這是為了保證兩台機器正常通信,不被其他機器惡意干擾。如果task_worker.py的authkey和task_master.py的authkey不一致,肯定連接不上。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/157260.html