我的這個需求,其實是將Python,移植到一個安卓手機上,
這個安卓手機是arm的。
一直想做一個超低功耗的服務器,用什么來做,其實都很難,
后來我決定用手機來做,
用手機來做個服務器,功耗肯定低於那些所謂的啥網X雲啥的。
之后,我用了一段時間,在網上花了45元錢,買了一部紅米2A手機,2G+16G,1.5Ghz*4。
這個配置已經算是很牛逼了。
然后就有了本文,如何把 python 移植上去,
很尷尬的時候,python 官網沒有提供arm 的安裝包,
網上大多的資料都是自己編譯python,然后移植,
我自然也這么做,
但是網上太多的教程,均無法完成這個需要,太尷尬,
經過自己一夜的摸索,終於找到了一套看似可行的方法,
說是看似可行,是因為 python 主程序編完了,也能在目標機器上運行,
但是還有一些其他的邊角腳本沒有打包到手機中,
不過不要緊,這里先只說明編譯的過程。
准備步驟,首先需要准備如下環境,
1:一台Windows10系統的電腦,如果有Linux 系統的,也可以,但是不在本文考慮范圍內
2:Windows10的電腦中安裝了 wsl ,能啟動一個ubuntu 子系統
3:下載,解壓adb,能用就行
地址:https://developer.android.com/studio/command-line/adb
4:下載一個指定版本的python 源碼,我這里使用的是 Python3.8.2
地址:https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
准備步驟結束,開始工作了
1:在wsl中先安裝對應版本的python,由於是x86環境,所以直接安裝x86的python即可。
如何安裝隨意。
2:在wsl中安裝gcc for arm。
命令如下:
安裝 arm gcc
apt-get install gcc-arm-linux-gnueabihf
安裝 arm g++
apt-get install g++-arm-linux-gnueabihf
3:解壓python 源碼,隨便放到什么地方
4:准備開始編譯了,需要先config 一下,
命令如下:
./configure --build=x86_64-pc-linux-gnu --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no
命令大意:
build 環境是:x86_64-px-linux-gnu
目標執行環境是:arm-linux-gnueabihf
C語言編譯器使用:arm-linux-gnueabihf-gcc
C++編譯器:arm-linux-gnueabihf-g++
正常來說,有如上四個參數就可以配置了,但是過程中由於環境不同,可能出現各種不同的報錯,
后面還有兩個參數,就是根據目標環境中配置過程出現的錯誤而添加的,
有些特殊的環境可能還要添加命令支持 long long 等。
5:如上命令執行完之后,經過一系列的config,可以正常結束。
配置結束之后,不要着急make,有個地方需要改一下。
打開makefile 文件,找到如下類似的位置,增加參數
1 CC= arm-linux-gnueabihf-gcc -pthread --static 2 CXX= arm-linux-gnueabihf-g++ -pthread --static
對,就是在CC 和 CXX 后面,增加兩個參數,
-pthread 參數是為了讓編譯結果不依賴pthread so,--static 是為了讓編譯結果不依賴任何 so
用途都是為了靜態編譯,
如果不這么做,那么會導致模塊就算編譯出來,到了手機中也無法運行。
6:如上makefile文件修改完了之后,
終於可以開始編譯了。
直接make 即可。
7:等啊,等啊,一直等到最后,可以看到編譯是可以成功的。
8:編譯成功之后,當前目錄下會出現一個叫做 python.exe 的文件。
為啥是 exe ,file一下
arm 版, 32 位程序,
看一下依賴,
dumpbin一下
沒有依賴。
完美
9:adb push 到手機里面
之后拷貝到指定位置
chmod
簡單執行一下,看一下版本
沒啥問題,能執行,沒有庫依賴,剩下的就是腳本包了
我先去休息下