当前位置:首页 » 编程语言 » pythonmakefile

pythonmakefile

发布时间: 2023-04-26 09:08:32

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内容 :

  • [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:

⑶ 初学者怎么学习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!

热点内容
万科海上传奇二期 发布:2024-11-01 14:22:52 浏览:59
u盘文件夹是空的 发布:2024-11-01 14:19:57 浏览:402
python包含字符串 发布:2024-11-01 14:19:17 浏览:479
c语言的精华 发布:2024-11-01 14:19:02 浏览:588
steam截图文件夹 发布:2024-11-01 14:18:59 浏览:613
ipad怎么往安卓传照片 发布:2024-11-01 14:18:19 浏览:508
我的电脑没有文件夹选项 发布:2024-11-01 14:13:55 浏览:546
vb创建数据库表 发布:2024-11-01 14:11:55 浏览:872
sql联合表 发布:2024-11-01 14:03:25 浏览:962
linux编程gcc 发布:2024-11-01 14:02:41 浏览:705