當前位置:首頁 » 編程語言 » makefilepython

makefilepython

發布時間: 2022-12-18 18:39:23

1. ubuntu下怎麼build一個完整的python

我們需要一個一個編譯這些包:
1. common.sh:這個文件里包含一些基礎設置,比如選用的GCC,CFLAGS和LDFLAGS如何配置。

[plain] view plain
export NDKDIR="/你的NDK路徑比如/android-ndk-r10c"
# GCC 版本選用,目前有4.6,4.8,4.9,選用時也注意linux系統的類型,這里x86_64是六十四位
export COMPILER="$NDKDIR/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"
export CC="$COMPILER/arm-linux-androideabi-gcc"
export CXX="$COMPILER/arm-linux-androideabi-g++"
export CPP="$COMPILER/arm-linux-androideabi-cpp"
export LD="$COMPILER/arm-linux-androideabi-ld"
export AS="$COMPILER/arm-linux-androideabi-as"
export AR="$COMPILER/arm-linux-androideabi-ar"
export STRIP="$COMPILER/arm-linux-androideabi-strip"
export OBJCOPY="$COMPILER/arm-linux-androideabi-obj"
export OBJDUMP="$COMPILER/arm-linux-androideabi-objmp"
export RANLIB="$COMPILER/arm-linux-androideabi-ranlib"
export NM="$COMPILER/arm-linux-androideabi-nm"
export STRINGS="$COMPILER/arm-linux-androideabi-strings"
export READELF="$COMPILER/arm-linux-androideabi-readelf"

# 選擇要編譯文件在哪個Android版本上使用,這里案例是在Android 4.2上使用,就是android 17;2.2對應Android 8,5.0對應Android 21
export ANDROID="$NDKDIR/platforms/android-17/arch-arm/usr"
# 配置系統頭文件和庫文件位置
export CFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CXXFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CPPFLAGS="-I$ANDROID/include"
export LDFLAGS="-L$ANDROID/lib"

2. 編譯openssl:

[plain] view plain
tar zxf openssl-1.0.1j.tar.gz
cd openssl-1.0.1j
mkdir dist

source common.sh
MACHINE=armv7 SYSTEM=android ./config -fPIC --prefix=./dist

# 在Makefile里做一些補丁,以防error
sed -i "s|-m64||" Makefile
sed -i "s|-Wall|-Wall --sysroot=$ANDROID|" Makefile

# 編譯並安裝
make
make install

3. 編譯ncurses,readline,sqlite

仿照openssl的方法,編譯另外三個庫;其實還有一個zlib需要編譯,當然後面不讓python支持bz2就可以忽略。
注意readline編譯最好選擇--with-curses,然後把編譯好的ncurses鏈接上。庫類文件編譯,盡量都加-fPIC,這是什麼,不從匯編說還真說不清楚,還是大家自己去看官方文檔吧。
對於localeconv的問題,大家最好改寫下那個locale.h,在裡面把localeconv的struct里fix放上你要的字元,比如decimal_point是".",這樣後面都不會出這類locale的問題了。
這里給出快捷的解決方案就是把localeconv幹掉,直接hardcode:

[plain] view plain
# 在ncurses編譯之前,需要打的補丁
sed -i "s/#define isDecimalPoint(c) .*/#define isDecimalPoint(c) ((c) == '.')/" form/fty_num.c
sed -i "s/localeconv()/NULL/" form/fty_num.c

[plain] view plain
# 編譯ncurses
./configure --prefix=/YourPath --disable-home-terminfo --without-ada
make
make install
[plain] view plain
# 編譯readline
./configure --prefix=/YourPath --host=arm-linux --build=x86_64-linux \
--enable-static --enable-shared --with-curses
make
make install
[plain] view plain
# 編譯sqlite
./configure --host=arm-linux --build=x86_64-linux
make
make install
4. 編譯Python:
其實過程整體和openssl沒有什麼區別,細節上有一些注意事項。
- configure文件是需要手動fix的,打開文件,搜索 ac_cv_file__dev_ptmx 和 ac_cv_file__dev_ptc;刪除對這兩個變數的自動判斷。手動去Android查看/dev文件夾里有沒有ptmx和ptc設備,有就設置為yes沒就no:

[plain] view plain
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no

- 打開Moles/Setup.dist文件,把需要的python模塊前面的#去掉,比如#_socket socketmole.c timemole.c,要python支持網路socket介面,需要把#去掉;建議盡量多加一些包;實在編譯不過的包不要,有些模塊需要額外下載開源軟體庫編譯,就不只openssl,ncurses,readline,sqlite了。

這樣就可以configure 了:

[plain] view plain
./configure --host=arm-unknown-linux-gnu --build=x86_64-unknown-linux-gnu \
--enable-ipv6

- 有一段編譯會報錯,仔細檢查,發現python需要編譯一個程序,這個程序跑在host上,但gcc是arm的,host linux是x86_64的,所以我們需要復制一份解壓好的python代碼,然後用本地原有的gcc編譯;當然編譯時直接./configure && make就可以了,直到Parser文件夾下出現了pgen這個可執行文件;把它拿出來,復制到另一個python源碼的Parser文件夾中,修改Makefile:

[plain] view plain
sed -i "s|\$(PGEN):.*|\$(PGEN):|" Makefile
sed -i "s|\$(CC) \$(OPT) \$(LDFLAGS) \$(PGENOBJS) \$(LIBS) -o \$(PGEN)|echo \"fake Parser/pgen\"|" Makefile
- 解決locale的問題,還有一些常量問題,笨方法hardcode:

[plain] view plain
sed -i "s|.*localeconv().*||" Objects/stringlib/localeutil.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|.*localeconv().*||" Objects/stringlib/formatter.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->decimal_point|\".\"|" Objects/stringlib/formatter.h
sed -i "s|.*localeconv().*||" Python/pystrtod.c
sed -i "s|locale_data->decimal_point|\".\"|" Python/pystrtod.c
sed -i "s|I_PUSH|0x5302|" Moles/posixmole.c
sed -i "s|p->pw_gecos|\"\"|" Moles/pwdmole.c

- Moles/socketmole.c: 需要去掉一些#if,不然頭文件里沒有定義,或者直接去$ANDROID的include文件夾把相應.h文件補充完整也可以。

[cpp] view plain
...
Py_BEGIN_ALLOW_THREADS
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_acquire_lock(netdb_lock, 1);
#endif
h = gethostbyaddr(ap, al, af);
Py_END_ALLOW_THREADS
ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_release_lock(netdb_lock);
#endif
return ret;
...

make然後make -i install,好啦,python編譯出來啦!

下面就是放到android上跑了。
需要Android是root的,不root也可以,就是得找個地方放。
需要把python編譯好的文件夾打包放到android上,還有sqlite里的那個so文件。
root的話可以在/system/bin里軟鏈接一個python。當然,sqlite.so.3要放在/system/lib里。
其實sqlite是可以不編譯的,但是我們的Django需要它,所以還是弄出來吧,ssl也可以不用,但是為了伺服器支持https,還是編譯下吧。
這樣就可以運行python了。

[html] view plain
# python
>>> 1+2
3
然後下載setuptools (https://pypi.python.org/pypi/setuptools/7.0) 和 pip (https://pypi.python.org/pypi/pip/1.5.6) 解壓並安裝:

[plain] view plain
gzip -d setuptools-7.0.tar.gz
tar xf setuptools-7.0.tar
cd setuptools-7.0
python setup.py build
python setup.py install

gzip -d pip-1.5.6.tar.gz
tar xf pip-1.5.6.tar
cd pip-1.5.6
python setup.py build
python setup.py install
把pip軟鏈接到/system/bin。好了,python有了pip,哈哈,隨心安裝包吧。先來個pip install virtualenv
接下去可以安裝django django-sslserver,把django-admin軟鏈接到/system/bin,就可以寫網站啦:

[plain] view plain
django-admin startproject test001
cd test001
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
不安裝django也可以直接對一個文件夾提供http服務:

[plain] view plain
python -m SimpleHTTPServer

有了server,在家庭里就可以搭建平台啦,如果有多個手機,連上wifi,就可以不用接線,完成無線分布式伺服器,趕快練習loadbalance吧。

嗯嗯,看看需不需要用手機伺服器隨時監控家裡的活動,然後插上SIM卡還能自動給我發簡訊,嘿嘿。

後面我們來想像怎麼解決pip install有時需要編譯c文件的問題。其實有團隊已經解決了這個問題。
下載Droid for GCC plugin的apk:http://www.liqucn.com/rj/228351.shtml (這個不是官網,最好去google play下載)
把apk解壓,然後找到gcc的壓縮包,裡面就有gcc了,把它放到Android上:

[plain] view plain
#include <stdio.h>
int main() {
printf("hello world!\n");
return 0;
}
然後gcc -o test test.c,並運行./test,完美輸出hello world。趕緊軟鏈接到/system/bin里吧。
好了,這樣numpy都可以編譯安裝了。還可以編譯下erl,把rabbitmq編譯下,弄個分布式也不是問題。最好移植一下lxc,然後把raspberry里的arm版java搬過來就無敵啦。買個USBminiB轉RJ45的頭就可以插網線了。

總體來說,可以搭建移動伺服器了,以後寫一些網頁版小應用,想用的時候android開個熱點,電腦一連,開始enjoy!

2. python怎麼用

建立一個python的文件,py格式。。如:Test.py

如寫入如下代碼計算a+b:(輸入用空格隔開)
import sysfor line in sys.stdin: a = line.split() print int(a[0]) + int(a[1])

運行方式是python -O Test.py ,其中-O是命令行選項,可以不寫。當然在cmd中運行python -O Test.py的話,要先把python的目錄添加系統的環境變數當中,要麼就運行python的運行環境在裡面寫代碼就可以了。呵呵

3. python最佳入門教程(1): python的安裝

本教程基於python3.x, 是針對初學者的一系列python入門教程,在知乎上常有人問我計算機該怎麼學,如何自學編程,筆者也是通過自學編程而進入IT這一行業的,回顧入行的這幾年,從音視頻流媒體輾轉到人工智慧深度學習,機器視覺,我是下了不少苦心的,對於如何學習有自己的一套理論和實踐方法,很多人自言學編程不得其門,把學不會歸咎於天分,其實芸芸眾生,智力無別,你現在所看到的是技術大牛們一個個超凡絕頂(然知此絕頂非彼絕頂),看不到的是曾經的他們,也在每個晝夜裡用心苦學。再者學一門技術,需要勤學刻苦,是需要講究方法和基礎的,方法對了就事半功倍,所謂的天才也無不是建立在扎實的基礎之上。
在windows中安裝python
首先打開python官網https://www.python.org/,點擊頁面downloads導航按鈕,下載windows最新的基於web安裝的安裝器,右鍵以管理員身份運行 安裝包,會出現如下界面:
將Add Python 3.7 to PATH 進行勾選,勾選此項的目的在於將python解釋器加入系統環境變數,則在後續的python開發中可直接在windows 命令行中執行python腳本。所謂的環境變數是系統運行環境的一系列參數,比如這里的系統環境變數是PATH,PATH保存了與路徑相關的參數,系統在路徑查找中,會對PATH保存的路徑進行搜索。
點擊install Now按鈕執行python的安裝
打開windows命令行界面(按windows鍵輸入cmd命令),輸入python -V,出現python版本的相關輸出,即表示安裝成功。
在Linux系統中安裝python
筆者的系統是CentOS, Linux系統默認有安裝python,但是其版本是2.x,在這里筆者以源碼安裝的形式來安裝python 3.X。首先進入python源碼包頁面 點擊下載最新的gzip格式的python源碼包,上傳到伺服器然後進行解壓,解壓後的目錄結構如下圖所示:
Linux中的configure與make
configure是Linux中的腳本配置工具,用來對源碼的當前安裝環境進行檢測,若檢測無誤,會在當前目錄生成一個供源碼編譯的Makefile腳本文件。
make是Linux系統下的編譯安裝工具,用來解釋執行makefile文件中的腳本命令,編譯命令。
現在我們開始編譯安裝python
(1) 在當前目錄執行./configure(2) 輸入 make && sudo make install
若無指定安裝目錄,python會被默認安裝在/usr/local目錄中, 讀者可以執行./configure --prefix=「你自定義的安裝目錄」來配置安裝路徑。安裝完畢以後進入/usr/local/bin目錄,輸入 「python3.x -V」 (這里的python3.x為你所安裝的python版本),若出現與python版本的相關輸出,即表示安裝成功。
為安裝的python設置軟鏈接
安裝的python可以以絕對路徑的方式來執行,每次敲一大段路徑來執行python未免麻煩,通常我們會給安裝的python設置軟鏈接,這里的軟鏈接類似於windows的快捷方式。
輸入以下命令來給python設置軟鏈接,筆者安裝的版本是python3.7, pip是python的包管理工具,會在教程的後續章節中進行詳細講解。
ln -s /usr/bin/python3 /usr/local/bin/python3.7 # 表示設置python3 為 /usr/local/bin/python3.7的快捷方式ln -s /usr/bin/pip3 /usr/local/bin/pip3.7 # 表示設置pip3 為 /usr/local/bin/pip3.7的快捷方式

4. 請教Scons python 編譯問題

一、概述

scons是一個Python寫的自動化構建工具,和GNU make相比優點明顯:
1、移植性:python能運行的地方,就能運行scons
2、擴展性:理論上scons只是提供了python的類,scons使用者可以在這個類的基礎上做所有python能做的事情。比如想把一個已經使用了Makefile大型工程切換到scons,就可以保留原來的Makefile,並用python解析Makefile中的編譯選項、源/目標文件等,作為參數傳遞給scons,完成編譯。
3、智能:Scons繼承了autoconf/automake的功能,自動解析系統的include路徑、typedef等;「以全局的觀點來看所有的依賴關系」

二、scons文件

scons中可能出現的文件:
SConstruct,Sconstruct,sconstruct,SConscript

scons將在當前目錄以下次序 SConstruct,Sconstruct,sconstruct 來搜索配置文件,從讀取的第一個文件中讀取相關配置。
在配置文件SConstruct中可以使用函數SConscript()函數來定附屬的配置文件。按慣例,這些附屬配置文件被命名為」SConscript」,當然也可以使用任意其它名字。

三、scons的命令行參數
scons: 執行SConstruct中腳本
scons -c clean
scons -Q 只顯示編譯信息,去除多餘的列印信息
scons -Q --implicit-cache hello 保存依賴關系
--implicit-deps-changed 強制更新依賴關系
--implicit-deps-unchanged 強制使用原先的依賴關系,即使已經改變

四、SConstruct提供的方法

1、Program:生成可執行文件

Program('hello.c') 編譯hello.c可執行文件,根據系統自動生成(hello.exe on Windows; hello on POSIX)
Program('hello','hello.c') 指定Output文件名(hello.exe on Windows; hello on POSIX)
Program(['hello.c', 'file1.c', 'file2.c']) 編譯多個文件,Output文件名以第一個文件命名
Program(source = "hello.c",target = "hello")
Program(target = "hello" , source = "hello.c")
Program('hello', Split('hello.c file1.c file2.c')) 編譯多個文件

Program(Glob("*.c"))
src = ["hello.c","foo.c"];Program(src)

2、Object:生成目標文件

Object('hello.c') 編譯hello.c目標文件,根據系統自動生成(hello.obj on Windows; hello.o on POSIX)

3、Library:生成靜態/動態庫文件

Library('foo', ['f1.c', 'f2.c', 'f3.c']) 編譯library
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 編譯 shared library
StaticLibrary('bar', ['f4.c', 'f5.c', 'f6.c']) 編譯 static library

庫的使用:

Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') 連接庫,不需加後綴或是前綴

4、SourceSignatures:判斷源文件是否修改
SourceSignatures('MD5') 根據內容是否改變,默認方式
SourceSignatures('timestamp') 根據修改時間

5、TargetSignatures:判斷目標文件是否改變
TargetSignatures('build') 根據編譯結果
TargetSignatures('content') 根據文件內容,如果只是加了句注釋,將不會被重新編譯

6、Ignore:忽略依賴關系

Ignore(hello, 'hello.h') 忽略某個依賴關系

7、Depends:明確依賴關系

Depends(hello, 'other_file') 明確依賴關系

8、SConscript:scons的配置文件。

源文件的目錄結構如下:
src:
| SConstruct
|test.cpp
| mA(目錄):
| SConscript
| func.cpp
其中test.cpp為主文件,中調用func.cpp中定義的函數

SConstruct內容如下:

[cpp]view plain

  • subobj=SConscript(['mA/SConscript'])

  • obj=subobj+Object(Glob("*.cpp"))

  • Program("test",list(obj))


  • SConscript內容 :

  • [cpp]view plain

  • obj=Object(Glob("*.cpp"))

  • Return("obj")


  • 上例中,在主目錄中執行 scons就可以編譯整個"工程"。SConstruct編譯主目錄中的test.cpp,並通過SConscript編譯mA目錄下的源文件,並最終生成可執行文件;SConscript用於編譯mA中的func.cpp並把生成的func.o傳遞給主目錄的SConstruct。

  • 10.env:環境變數
    環境變數用於設置在編譯過程中的各種參數,可以用下面的SConstruct列印環境變數的所有信息(實際上env就是一個python字典)
    可以使用如下的SConstruct查看環境變數的內容:

    [cpp]view plain

  • env=Environment()

  • dict=env.Dictionary()

  • keys=dict.keys()

  • keys.sort()

  • forkeyinkeys:

  • print"constructionvariable='%s',value='%s'"%(key,dict[key])


  • 環境變數的使用:

  • env = Environment() #創建默認的環境變數,默認scons會按編譯器的默認選項來進行編譯

  • import os

  • env = Environment(CC = 'gcc',CCFLAGS = '-O2') #創建並設置環境 變數

  • env.Program('foo.c')
  • 環境變數的復制:
    env = Environment(CC = 'gcc')
    opt = env.Clone(CCFLAGS = '-O2')
    dbg = env.Clone(CCFLAGS = '-g')

    環境變數的替換:
    env = Environment(CCFLAGS = '-DDEFINE1')
    env.Replace(CCFLAGS = '-DDEFINE2')
    env.Program('foo.c')
    環境變數的輸入輸出:用於統一多目錄源文件的編譯選項,如:
    src:
    | SConstruct
    | libstlport.a
    | test.cpp
    | include(目錄):
    | foo.h
    | mA(目錄):
    | SConscript
    |func.cpp

    test.cpp和mA/func.cpp都引用了include/foo.h,test.cpp調用了mA/func.cpp的功能函數,其中include/foo.h中定義了一個包含string類型的類。

    SConstruct如下:

    [cpp]view plain

  • env=Environment()

  • flags=env.ParseFlags(['-pthread-I/usr/include/stlport','-L.'])

  • env.MergeFlags(class_flags)

  • subobj=SConscript(['mA/SConscript'])

  • obj=subobj+env.Object(Glob("*.cpp"))

  • env.Program("test",list(obj),LIBS=['libstlport.a'])

  • mA/SConscrip如下:

    [cpp]view plain

  • obj=Object(Glob("*.cpp"))

  • Return("obj")


  • 不出意外的話上邊的工程編譯可以通過,但是運行的時候會Aborted。因為test.cpp,mA/func.cpp都使用了包含string類型的那個類,但是由於編譯環境的不同,test.cpp認為string變數的大小是24位元組, mA/func.cpp認為string變數的大小是4個位元組(libstlport.a搗的鬼)。

    解決問題的辦法就是環境變數輸出,修改SConstruct和mA/SConscript如下:
    SConstruct:

    [cpp]view plain

  • env=Environment()

  • flags=env.ParseFlags(['-pthread-I/usr/include/stlport','-L.'])

  • env.MergeFlags(class_flags)

  • Export('env')

  • subobj=SConscript(['mA/SConscript'],exports='env')

  • obj=subobj+env.Object(Glob("*.cpp"))

  • env.Program("test",list(obj),LIBS=['libstlport.a'])


  • mA/SConscript:

5. python makefile與open的區別

這段文字的意思是說python的socket模塊中提供了makefile()方法,生成一個文件與socket對象關聯,然後就跟讀普通文件一樣使用socket。(對普通文件有open,write等方法)


如下面這段示例代碼:

importsocket,sys
port=70
host=sys.argv[1]
filename=sys.argv[2]
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
fd=s.makefile('rw',0)
fd.write(filename+" ")
forlineinfd.readlines():
sys.stdout.write(line)

6. 如何交叉編譯Python到ARMLinux平台 / 藍訊

步驟一:部署protoc.exe
1)sudo su ---進入管理模式
//以下操作切換至protobuf文件夾下
2)。/configure
3)make
4)make check
5)make install
此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)
6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備

熱點內容
我的世界創造房子伺服器 發布:2024-05-20 06:48:36 瀏覽:818
小米筆記本存儲不夠 發布:2024-05-20 06:32:53 瀏覽:784
dirt5需要什麼配置 發布:2024-05-20 06:02:58 瀏覽:543
怎麼把電腦鎖上密碼 發布:2024-05-20 05:19:09 瀏覽:985
安卓為什麼連上wifi後沒有網路 發布:2024-05-20 05:17:50 瀏覽:419
安卓usb在設置哪裡 發布:2024-05-20 05:03:03 瀏覽:187
綏化編程 發布:2024-05-20 04:59:44 瀏覽:991
基本原理和從頭計演算法 發布:2024-05-20 04:50:32 瀏覽:30
配置情況指的是什麼 發布:2024-05-20 04:48:14 瀏覽:497
那個程序用來編譯源文件 發布:2024-05-20 04:46:45 瀏覽:551