關於調用外部命令時與外部命令的數據交互的注意點

前兩天,我打算下載點圖片。用fiddler分析了下,結果那個網頁大量使用js來操做cookie,弄得我頭大。python

go卻是有V8引擎的封裝包,但是必須還得編譯這個引擎,挺麻煩的。瀏覽器

想起來還有selenium-python能夠用。就決定這個了。由於selenium沒有python3.4的版本,不得不重裝了python2.7。cookie

多說一句,python3確實比python2的組織等各個方面改進不少,寫起來感受更好。惋惜第三方庫稀少是硬傷。網絡

當時個人思路是這樣的,用python和selenium來操做瀏覽器,提取網頁圖片地址和標題,傳遞給go,由go下載。python2.7

之因此由go下載,是由於python2的urllib等網絡庫有問題,常常會下載資源失敗卻不返回錯誤。相比之下,go的net庫能夠保證只要錯誤值是nil,下載必然完整。編碼

我寫了個python腳本,該python腳本會從標準輸入接受一個網址,而後返回標題,以後,會依次訪問每一個漫畫頁面並返回圖片網址。最後會輸出一個結束標誌。下載完畢後,能夠再次接受網址進行下一次下載。url

能夠用go的exec.Command啓動python腳本,而後用*Cmd類型返回值的StdinPipe()、StdoutPipe()方法的返回值來實現與子進程的交互,使用Start()方法啓動命令就好了。code

實際上是個很簡單的程序,算上go程,log,加鎖,監視剪貼板等等部分也不到80行。進程

戲肉來了。我發現當標題中包含漢字時,程序就會出問題。主程序沒有得到標題,子命令掛掉了。圖片

檢查了一下,我認爲有兩種可能的緣由:

1)漢字編碼問題。python會將漢字編碼爲本地編碼(gbk)輸出到標準輸出;可是go會把它們看成utf-8編碼處理。

2)這種調用外部命令並進行交互的狀況,就不支持非ASCII碼。

最後個人解決方案是在python腳本里將unicode字符串編碼爲utf-8字節串而後用base64編碼,go裏採用base64解碼。這樣無論是哪一個緣由確定都沒問題了。由於主要耗時在下載上,這點不便無所謂。

不過具體是哪一種緣由,我就不清楚了。

相關文章
相關標籤/搜索