pythonmakefile
⑴ linux中make, make install命令分別是什麼,用法
make是用來編譯的,它從Makefile中讀取指令,然後編譯。
make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
用法:
1、make:
這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟體需要調用perl或python來進行編譯)。
如果 在 make 過程中出現 error ,就要記下錯誤代碼(注意不僅僅是最後一行),然後可以向開發者提交 bugreport(一般在 INSTALL 里有提交地址)。
或者系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。
make 的作用是開始進行源代碼編譯,以及一些功能的提供,這些功能由他的 Makefile 設置文件提供相關的功能。
比如 make install 一般表示進行安裝,make uninstall 是卸載,不加參數就是默認的進行源代碼編譯。
make 是 Linux 開發套件裡面自動化編譯的一個控製程序,他通過藉助 Makefile 裡面編寫的編譯規范進行自動化的調用 gcc 、ld 以及運行某些需要的程序進行編譯的程序。
一般情況下,他所使用的 Makefile 控制代碼,由 configure 這個設置腳本根據給定的參數和系統環境生成。
2、make install
這條命令來進行安裝(當然有些軟體需要先運行 make check 或 make test來進行一些測試),這一步一般需要你有 root 許可權(因為要向系統寫入文件)。
(1)pythonmakefile擴展閱讀
當我們在使用make命令時,常常會在make後面加上其他單詞,比如check,install,installcheck…這些單詞都是make的參數,我們稱之為「目標(targets)」。
最常見的幾個目標:
make all:編譯程序、庫、文檔等(等同於make)
make install:安裝已經編譯好的程序。復制文件樹中到文件到指定的位置
make unistall:卸載已經安裝的程序。
make clean:刪除由make命令產生的文件
make distclean:刪除由./configure產生的文件
make check:測試剛剛編譯的軟體(某些程序可能不支持)
make installcheck:檢查安裝的庫和程序(某些程序可能不支持)
make dist:重新打包成packname-version.tar.gz
⑵ 請教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內容 :
obj=Object(Glob("*.cpp"))
Return("obj")
- 上例中,在主目錄中執行 scons就可以編譯整個"工程"。SConstruct編譯主目錄中的test.cpp,並通過SConscript編譯mA目錄下的源文件,並最終生成可執行文件;SConscript用於編譯mA中的func.cpp並把生成的func.o傳遞給主目錄的SConstruct。
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()
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'])
obj=Object(Glob("*.cpp"))
Return("obj")
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:
[cpp]view plain
10.env:環境變數
環境變數用於設置在編譯過程中的各種參數,可以用下面的SConstruct列印環境變數的所有信息(實際上env就是一個python字典)
可以使用如下的SConstruct查看環境變數的內容:
[cpp]view plain
環境變數的復制:
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
mA/SConscrip如下:
[cpp]view plain
不出意外的話上邊的工程編譯可以通過,但是運行的時候會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
⑶ 初學者怎麼學習Python
初學者、零基礎學Python的話,建議參加培訓班,入門快、效率高、周期短、實戰項目豐富,還可以提升就業競爭力。
以下是老男孩教育Python全棧課程內容:階段一:Python開發基礎
Python開發基礎課程內容包括:計算機硬體、操作系統原理、安裝linux操作系統、linux操作系統維護常用命令、Python語言介紹、環境安裝、基本語法、基本數據類型、二進制運算、流程式控制制、字元編碼、文件處理、數據類型、用戶認證、三級菜單程序、購物車程序開發、函數、內置方法、遞歸、迭代器、裝飾器、內置方法、員工信息表開發、模塊的跨目錄導入、常用標准庫學習,b加密\re正則\logging日誌模塊等,軟體開發規范學習,計算器程序、ATM程序開發等。
階段二:Python高級級編編程&資料庫開發
Python高級級編編程&資料庫開發課程內容包括:面向對象介紹、特性、成員變數、方法、封裝、繼承、多態、類的生成原理、MetaClass、__new__的作用、抽象類、靜態方法、類方法、屬性方法、如何在程序中使用面向對象思想寫程序、選課程序開發、TCP/IP協議介紹、Socket網路套接字模塊學習、簡單遠程命令執行客戶端開發、C\S架構ftp伺服器開發、線程、進程、隊列、IO多路模型、資料庫類型、特性介紹,表欄位類型、表結構構建語句、常用增刪改查語句、索引、存儲過程、視圖、觸發器、事務、分組、聚合、分頁、連接池、基於資料庫的學員管理系統開發等。
階段三:前端開發
前端開發課程內容包括:HTML\CSS\JS學習、DOM操作、JSONP、原生Ajax非同步載入、購物商城開發、Jquery、動畫效果、事件、定時期、輪播圖、跑馬燈、HTML5\CSS3語法學習、bootstrap、抽屜新熱榜開發、流行前端框架介紹、Vue架構剖析、mvvm開發思想、Vue數據綁定與計算屬性、條件渲染類與樣式綁定、表單控制項綁定、事件綁定webpack使用、vue-router使用、vuex單向數據流與應用結構、vuex actions與mutations熱重載、vue單頁面項目實戰開發等。
階段四:WEB框架開發
WEB框架開發課程內容包括:Web框架原理剖析、Web請求生命周期、自行開發簡單的Web框架、MTV\MVC框架介紹、Django框架使用、路由系統、模板引擎、FBV\CBV視圖、Models ORM、FORM、表單驗證、Django session & cookie、CSRF驗證、XSS、中間件、分頁、自定義tags、Django Admin、cache系統、信號、message、自定義用戶認證、Memcached、redis緩存學習、RabbitMQ隊列學習、Celery分布式任務隊列學習、Flask框架、Tornado框架、Restful API、BBS+Blog實戰項目開發等。
階段五:爬蟲開發
爬蟲開發課程內容包括:Requests模塊、BeautifulSoup,Selenium模塊、PhantomJS模塊學習、基於requests實現登陸:抽屜、github、知乎、博客園、爬取拉鉤職位信息、開發Web版微信、高性能IO性能相關模塊:asyncio、aiohttp、grequests、Twisted、自定義開發一個非同步非阻塞模塊、驗證碼圖像識別、Scrapy框架以及源碼剖析、框架組件介紹(engine、spider、downloader、scheler、pipeline)、分布式爬蟲實戰等。
階段六:全棧項目實戰
全棧項目實戰課程內容包括:互聯網企業專業開發流程講解、git、github協作開發工具講解、任務管理系統講解、介面單元測試、敏捷開發與持續集成介紹、django + uwsgi + nginx生產環境部署學習、介面文檔編寫示例、互聯網企業大型項目架構圖深度講解、CRM客戶關系管理系統開發等。
階段七:數據分析
數據分析課程內容包括:金融、股票知識入門股票基本概念、常見投資工具介紹、市基本交易規則、A股構成等,K線、平均線、KDJ、MACD等各項技術指標分析,股市操作模擬盤演示量化策略的開發流程,金融量化與Python,numpy、pandas、matplotlib模塊常用功能學習在線量化投資平台:優礦、聚寬、米筐等介紹和使用、常見量化策略學習,如雙均線策略、因子選股策略、因子選股策略、小市值策略、海龜交易法則、均值回歸、策略、動量策略、反轉策略、羊駝交易法則、PEG策略等、開發一個簡單的量化策略平台,實現選股、擇時、倉位管理、止盈止損、回測結果展示等功能。
階段八:人工智慧
人工智慧課程內容包括:機器學習要素、常見流派、自然語言識別、分析原理詞向量模型word2vec、剖析分類、聚類、決策樹、隨機森林、回歸以及神經網路、測試集以及評價標准Python機器學習常用庫scikit-learn、數據預處理、Tensorflow學習、基於Tensorflow的CNN與RNN模型、Caffe兩種常用數據源製作、OpenCV庫詳解、人臉識別技術、車牌自動提取和遮蔽、無人機開發、Keras深度學習、貝葉斯模型、無人駕駛模擬器使用和開發、特斯拉遠程式控制制API和自動化駕駛開發等。
階段九:自動化運維&開發
自動化運維&開發課程內容包括:設計符合企業實際需求的CMDB資產管理系統,如安全API介面開發與使用,開發支持windows和linux平台的客戶端,對其它系統開放靈活的api設計與開發IT資產的上線、下線、變更流程等業務流程。IT審計+主機管理系統開發,真實企業系統的用戶行為、管理許可權、批量文件操作、用戶登錄報表等。分布式主機監控系統開發,監控多個服務,多種設備,報警機制,基於http+restful架構開發,實現水平擴展,可輕松實現分布式監控等功能。
階段十:高並發語言GO開發高並發語言GO開發課程內容包括:Golang的發展介紹、開發環境搭建、golang和其他語言對比、字元串詳解、條件判斷、循環、使用數組和map數據類型、go程序編譯和Makefile、gofmt工具、godoc文檔生成工具詳解、斐波那契數列、數據和切片、make&new、字元串、go程序調試、slice&map、map排序、常用標准庫使用、文件增刪改查操作、函數和面向對象詳解、並發、並行與goroute、channel詳解goroute同步、channel、超時與定時器reover捕獲異常、Go高並發模型、Lazy生成器、並發數控制、高並發web伺服器的開發等。
⑷ python可以改寫MBR嗎
肯定是可以的,你可以嘗試使用python的c擴展
一, 實驗內容
改寫bootsect.s和setup.s, 完成如下主要功能:
1, bootsect.s能夠在屏幕上列印一段提示信息"XXX is booting...", 其中XXX是你給自己的操作系統起的名字,例如LZJos、Sunix等.
2, bootsect.s能夠完成setup.s的載入, 並跳轉到setup.s開始地址執行.
3, setup.s能夠像屏幕輸出一行信息 "Now we are in SETUP"
4, setup.s能獲取至少一個基本的硬體參數(如內存參數、顯卡參數、硬碟參數等),將其存放在內存的特定地址,並輸出到屏幕上。
setup.s不再載入linux內核, 保持上述信息顯示到屏幕上即可
二, 實驗步驟
1, 完成bootsect的屏幕輸出功能
由於不需要載入linux內核,所以就不需要原始的linux代碼那麼復雜,比如: 將bootsect自身移動到0x90000處等操作,可以忽略的。
要顯示字元串,那麼字元串顯示到屏幕的哪裡呢?當然是當前游標的位置了!所以第一步就要先讀取游標的位置,這可以利用10號中斷的3號子程序來完成。要顯示字元串,余扒可以利用10號功能的13號子程序來完成,需要注意的是一定要邊顯示字元邊移動游標,最終的游標要移動到字元串的末尾處。最後要注意用0xAA55來標記引導扇區。代碼如下:
! 文件:bootsect.s
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的團毀答13號功能顯示字元串
mov cx,#50 ! 加上回車和換行,字元串一共包含50個字元,所以設置cx為50
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax ! es:bp=顯示字元串的地址
mov ax,#0x1301
int 0x10
Inf_loop:
jmp Inf_loop ! 無限循環
! msg1處放置要顯示的字元串
msg1:
.byte 13,10 ! 換行+回車
.ascii "AXF OS is booting, my name is Aixiangfei ..."
.byte 13,10,13,10 ! 兩對換行+回車
! 下面是啟動盤具有有效引導扇區的標志. 僅供BIOS中的程序載入扇區時識別使用。
! 它必須位於引導扇區的最後兩個位元組中.
.org 510
boot_flag:
.word 0xAA55 ! 引導扇區的標記就是0XAA55
編譯和運行: 進入~/oslab/linux-0.11/boot/目錄,編譯並連接:
as86 -0 -a -o bootsect.o bootsect.s
ld86 -0 -s -o bootsect bootsect.o
參數說明:-0(注意:這是數字0,不是字母O)表示生成8086的16位目標程序,-a表示生成與GNU as和ld部分兼容的代碼,-s告訴鏈接器ld86去除最後生成的可執行文件中的符號信息。
如果這兩個命令沒有任何輸出,說明編譯與鏈接都通過了。需要留意的生成的塌慧bootsect的大小是544位元組,而引導程序必須要正好佔用一個磁碟扇區,即512個位元組。造成多了32個位元組的原因是ld86產生的是Minix可執行文件格式,這樣的可執行文件處理文本段、數據段等部分以外,還包括一個Minix可執行文件頭部。所以最後必須要把這多餘的32個位元組刪掉,可以用linux自帶的工具dd來完成:
dd bs=1 if=bootsect of=Image skip=32
去掉這32個位元組後,將生成的文件拷貝到linux-0.11目錄下,並一定要命名為「Image」(注意大小寫)。然後就可以run了
程序有可能需要不斷地修改調試,為了方便,可以將上述的一系列操作寫道一個shell腳本文件 cbootsect.sh 中:
#!/bin/sh
as86 -0 -a -o bootsect.o bootsect.s
ld86 -0 -s -o bootsect bootsect.o
dd bs=1 if=bootsect of=Image skip=32
cp Image ../
../../run
運行結果:
2, setup的載入
首先要確定setup是在磁碟的0磁軌2扇區,linux 0.11中的setup佔了4個扇區,而我們最後要寫的setup顯然沒有那麼復雜,所以可以只用1個扇區就可以了。另外,由於bootsect位於0x7c00處,佔用512個位元組,所以可以將setup載入到0x7e00處。要想從磁碟中載入數據到內存,可以利用BIOS提供的13號中斷輕松完成。最後就直接用jumi指令跳轉到0x7e00處即可。對前面的bootsect.s擴展之後的完整代碼如下:
! 文件:bootsect.s
SETUPLEN = 1
SETUPSEG = 0x07e0
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的13號功能顯示字元串
mov cx,#50 ! 加上回車和換行,字元串一共包含50個字元,所以設置cx為50
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax ! es:bp=顯示字元串的地址
mov ax,#0x1301
int 0x10
load_setup:
mov dx,#0x0000 ! 設置驅動器和磁頭(drive 0, head 0): 軟盤0磁頭
mov cx,#0x0002 ! 設置扇區號和磁軌(sector 2, track 0):0磁頭、0磁軌、2扇區
mov bx,#0x0200 ! 設置讀入的內存地址:BOOTSEG+address = 512,偏移512位元組
mov ax,#0x0200+SETUPLEN ! 設置讀入的扇區個數(service 2, nr of sectors),
! SETUPLEN是讀入的扇區個數,Linux 0.11設置的是4,
! 我們不需要那麼多,我們設置為1
int 0x13 ! 應用0x13號BIOS中斷讀入1個setup.s扇區
jnc ok_load_setup ! 讀入成功,跳轉到ok_load_setup: ok - continue
mov dx,#0x0000 ! 軟碟機、軟盤有問題才會執行到這里
mov ax,#0x0000 ! 否則復位軟碟機
int 0x13
j load_setup ! 重新循環,再次嘗試讀取
ok_load_setup:
jmpi 0,SETUPSEG
! msg1處放置要顯示的字元串
msg1:
.byte 13,10 ! 換行+回車
.ascii "AXF OS is booting, my name is Aixiangfei ..."
.byte 13,10,13,10 ! 兩對換行+回車
! 下面是啟動盤具有有效引導扇區的標志. 僅供BIOS中的程序載入扇區時識別使用。
! 它必須位於引導扇區的最後兩個位元組中.
.org 510
boot_flag:
.word 0xAA55 ! 引導扇區的標記就是0XAA55
3, 完成setup的屏幕輸出功能
這個很簡單,跟bootsect是一樣的。代碼如下:
! 文件:setup.s
entry _start
_start:
! 首先利用10號中斷的3號功能來讀取游標位置
mov ah,#0x03
xor bh,bh
int 0x10
! 再利用10號中斷的13號功能顯示字元串
mov cx,#26
mov bx,#0x0007
mov bp,#msg
mov ax,cs
mov es,ax
mov ax,#0x1301
int 0x10
Inf_loop:
jmp Inf_loop ! 無限循環
msg:
.byte 13,10
.ascii "Now we are in SETUP."
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
編譯和與運行:現在有兩個文件都要編譯、鏈接。一個個手工編譯,效率低下,所以藉助Makefile是最佳方式。linux 0.11中Makefile文件已經幫我們把這件事做好了。進入liux-0.11目錄後,使用命令:
$ make BootImage
但是我們發現竟然出現了錯誤:
原因:這是因為make根據Makefile的指引執行了tools/build.c,它是為生成整個內核的鏡像文件而設計的,沒考慮我們只需要bootsect.s和setup.s的情況。build.c從命令行參數得到bootsect、setup和system內核的文件名,將三者做簡單的整理後一起寫入Image。其中system是第三個參數(argv[3])。當「make all」或者「makeall」的時候,這個參數傳過來的是正確的文件名,build.c會打開它,將內容寫入Image。而「make BootImage」時,傳過來的是字元串"none"。所以,修改build.c的思路就是當argv[3]是"none"的時候,只寫bootsect和setup,忽略所有與system有關的工作,或者在該寫system的位置都寫上「0」。
修改build.c文件很簡單,只需要把第178到183這幾行代碼刪除即可!
// if ((id=open(argv[3],O_RDONLY,0))<0)
// die("Unable to open 'system'");
// if (read(id,buf,GCC_HEADER) != GCC_HEADER)
// die("Unable to read header of 'system'");
// if (((long *) buf)[5] != 0)
// die("Non-GCC header of 'system'");
run
4, 讀取硬體參數
這個部分是最復雜的了。需要列印的硬體信息有:游標位置,內存大小,磁碟的柱面數,磁頭數,每磁軌的扇區數。在這個實驗中,這些參數的信息可以保存在內存中的任意位置,在linux 0.11中,這些參數信息是被保存到了0x90000處,所以不妨跟linux 0.11一樣。
(1)獲取硬體參數
獲得游標位置信息,這個很簡單,只需要調用13號中斷的3號子程序就可以得到,前面已經用過了的。
獲得內存大小,可以調用用15號中斷的88號子程序得到,也很簡單。
與磁碟相關的信息稍微復雜一點,這些信息被保存在0x0000:0x0104地址處的16個位元組的中,這16個位元組的信息叫做「磁碟參數表」。所以獲得磁碟信息的方法就是復制數據。
(2)數字轉字元
現在已經將這些硬體參數取出來放在了0x90000處,接下來的工作是將這些參數顯示在屏幕上。這些參數都是一些無符號整數,所以需要做的主要工作是用匯編程序在屏幕上將這些整數用16進制的形式顯示出來。
因為十六進制與二進制有很好的對應關系(每4位二進制數和1位十六進制數存在一一對應關系),顯示時只需將原二進制數每4位劃成一組,按組求對應的ASCII碼送顯示器即可。ASCII碼與十六進制數字的對應關系為:0x30~0x39對應數字0~9,0x41~0x46對應數字a~f。從數字9到a,其ASCII碼間隔了7h,這一點在轉換時要特別注意。為使一個十六進制數能按高位到低位依次顯示,實際編程中,需對bx中的數每次循環左移一組(4位二進制),然後屏蔽掉當前高12位,對當前餘下的4位(即1位十六進制數)求其ASCII碼,要判斷它是0~9還是a~f,是前者則加0x30得對應的ASCII碼,後者則要加0x37才行,最後送顯示器輸出。以上步驟重復4次,就可以完成bx中數以4位十六進制的形式顯示出來。
因為在輸出的時候需要調用多次,所以最好把這個功能寫成一個函數print_bx,方便使用。既然要用到函數,故一定要先設置好棧。為了方便,還可以寫一個函數print_nl實現換行的功能。
INITSEG = 0x9000
entry _start
_start:
! 在顯示字元串之前必須先獲取當前游標的位置,這樣就可以把字元串顯示到當前游標處了
mov ah,#0x03
xor bh,bh
int 0x10
! 利用10號中斷的13號功能列印字元串"Now we are in SETUP."
mov cx,#26
mov bx,#0x0007
mov bp,#msg1
mov ax,cs
mov es,ax
mov ax,#0x1301
int 0x10
! 下面開始讀取一些硬體參數
! 讀入游標位置信息,保存到0x90000處
mov ax,#INITSEG
mov ds,ax
mov ah,#0x03
xor bh,bh
int 0x10
mov [0],ds
! 讀入內存大小位置信息,保存到0x90002處
mov ah,#0x88
int 0x15
mov [2],ax
! 從0x41處拷貝16個位元組(磁碟參數表)到0x90004處
mov ax,#0x0000
mov ds,ax
lds si,[4*0x41]
mov ax,#INITSEG
mov es,ax
mov di,#0x0004
mov cx,#0x10
rep ! 重復16次
movsb
! 先列印游標位置
! 列印字元串之前要先讀取游標位置,將字元串列印到當前游標處
mov ah,#0x03
xor bh,bh
int 0x10
! 列印字元串 "Cursor POS:"
mov cx,#11
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg2
mov ax,#0x1301
int 0x10
! 調用列印函數,列印游標位置
mov ax,#0x9000
mov ds,ax
mov dx,0x0
call print_hex
call print_nl
! 列印內存大小
! 列印字元串"Memory SIZE:"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#12
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg3
mov ax,#0x1301
int 0x10
! 調用列印函數,列印內存大小信息
mov ax,#0x9000
mov ds,ax
mov dx,0x2
call print_hex
! 列印字元串"KB"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#2
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg4
mov ax,#0x1301
int 0x10
call print_nl
!列印柱面數
! 列印字元串"Cyls"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#5
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg5
mov ax,#0x1301
int 0x10
! 調用列印函數列印磁碟柱面數
mov ax,#0x9000
mov ds,ax
mov dx,0x4
call print_hex
call print_nl
! 列印磁頭數
! 列印字元串"Heads:"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#6
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg6
mov ax,#0x1301
int 0x10
! 調用列印函數列印磁碟磁頭數
mov ax,#0x9000
mov ds,ax
mov dx,0x6
call print_hex
call print_nl
! 列印每磁軌扇區數
! 列印字元串"sectors"
mov ah,#0x03
xor bh,bh
int 0x10 ! 讀取游標位置
mov cx,#8
mov bx,#0x0007
mov ax,cs
mov es,ax
mov bp,#msg7
mov ax,#0x1301
int 0x10
! 調用列印函數列印扇區數
mov ax,#0x9000
mov ds,ax
mov dx,0x12
call print_hex
call print_nl
Inf_loop:
jmp Inf_loop ! 無限循環
! print_hex函數:將一個數字轉換為ascii碼字元,並列印到屏幕上
! 參數值:dx
! 返回值:無
print_hex:
mov cx,#4 ! 要列印4個十六進制數字,故循環4次
print_digit:
rol dx,#4 ! 循環以使低4比特用上 !! 取dx的高4比特移到低4比特處
mov ax,#0xe0f ! ah = 請求的功能值,al = 半位元組(4個比特)掩碼
and al,dl ! 取dl的低4比特值
add al,#0x30 ! 給al數字加上十六進制0x30
cmp al,#0x3a
jl outp ! 如果是一個不大於十的數字
add al,#0x07 ! 如果是a~f,要多加7
outp:
int 0x10
loop print_digit ! 用loop重復4次
ret
! 列印回車換行
print_nl:
mov ax,#0xe0d
int 0x10
mov al,#0xa
int 0x10
ret
msg1:
.byte 13,10
.ascii "Now we are in SETUP."
.byte 13,10,13,10
msg2:
.ascii "Cursor POS:"
msg3:
.ascii "Memory SIZE:"
msg4:
.ascii "KB"
msg5:
.ascii "Cyls:"
msg6:
.ascii "Heads:"
msg7:
.ascii "Sectors:"
.org 510
boot_flag:
.word 0xAA55
運行結果:
⑸ 如何在已經存在python2的linux環境上安裝python3
如何在已經存在python2的linux環境上安裝python3
有的人態寬盯在安裝的時候可能會先將python2解除安裝掉,這個地方嚴重強調一下,不要去解除安裝系統中已經存在的python2,否則會造成系統中好多其他需要python執行的程式異常
系統環境
[root@localhost install]# pwd
/data/install
[root@localhost install]# cat /etc/redhat-release
CentOS release 6.3 (Final)
[root@localhost install]# uname -a
Linux localhost 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
python3.4的安裝方法
[root@localhost install]# wget :python./ftp/python/3.4.4/Python-3.4.4.tgz
[root@localhost install]# tar -zxf Python-3.4.4.tgz
[root@localhost install]# cd Python-3.4.4
# 在安裝包中有一個README的檔案帆和,裡面有寫如何安裝
[root@localhost Python-3.4.4]# ls
aclocal.m4 config.sub configure.ac Grammar install-sh LICENSE Makefile.pre.in Moles Parser PCbuild Python setup.py
config.guess configure Doc Include Lib Mac Misc Objects PC pyconfig.h.in README Tools
[root@localhost Python-3.4.4]# ./configure
[root@localhost Python-3.4.4]# make
[root@localhost Python-3.4.4]# make install
測試
[root@localhost Python-3.4.4]# python3
Python 3.4.4 (default, Jun 27 2016, 07:47:54)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux
Type "help", "right", "credits" or "license" for more information.
>>>
以後執行python程式就可以使用python3 程式名 去執行了
已經存在python2的linux環境上安裝python3,有兩種方法,第一種是替換python2,第二種是直接安裝python3,而不替換python2,這樣的話,在python3執行的時候,就要寫成python3+啟動等巧禪語句
⑹ LINUX下安裝Python為什麼總是不成功
沒有make命令弊仿,如果你使用的centos,你可以執行
yum-
來安飢卜亮裝爛寬
⑺ ubuntu系統運行python程序,怎麼寫makefile
python寫的程序要make?python程升梁序是解釋執行的,不用編譯,
直接在命令行運行命令
python 程序文件吵凱運名
難道有要編譯的python程序孫肆?
⑻ 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的快捷方式
⑼ centos 7 為什麼 python3 知乎
1–下載python3.5的包
在python官網https://www.python.org/downloads/release/python-351/
下載tgz包就可以了。其實下面的2個包其一都可以使用
Python-3.5.1.tgz (這個不是編譯過的東西,不能解壓之後直接使用)
Python-3.5.1.tar.xz (這個是pthon的源碼)
2–解壓文件
tar -xf Python-3.5.1.tgz
3–解壓之後有一個目錄Python-3.5.1,進入目錄
cd Python-3.5.1
4–開始安裝,使用編譯的方法進行安裝
在python的目錄中有一個README文件,他介紹了如何安裝python。 但是我們要指定這個安裝目錄
mkdir /usr/python3.5./configure --prefix=/usr/python3.5makemake install
說明./configure命令執行完畢之後創建一個文件creating Makefile,供下面的make命令使用 執行make install之後就會把程序安裝到我們指定的目錄中去
5–讓系統默認使用Python 3.5.1
在/usr/bin中有python、python2、python2.7三個文件依次指向後者,我們將python備份
cd /usr/bin mv python python.bak ln -s /usr/python3.5/bin/python3 /usr/bin/python
注意我們編譯安裝之後在/usr/python3.5/bin下會自動生成一個python3的連接,他指向bin目錄中的python3.5
6–因為yum使用python2,因此替換為python3後可能無法正常工作,繼續使用這個python2.7.5
因此修改yum配置文件(sudo vi /usr/bin/yum)。 把文件頭部的#!/usr/bin/python改成#!/usr/bin/python2.7保存退出即可
⑽ 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!