导航:首页 > 编程语言 > pythonmmap模块

pythonmmap模块

发布时间:2022-08-26 03:06:37

❶ 如何用python一门语言通吃高性能并发,GPU计算和深度学习

第一个就是并发本身所带来的开销即新开处理线程、关闭处理线程、多个处理线程时间片轮转所带来的开销。

实际上对于一些逻辑不那么复杂的场景来说这些开销甚至比真正的处理逻辑部分代码的开销更大。所以我们决定采用基于协程的并发方式,即服务进程只有一个(单cpu)所有的请求数据都由这个服务进程内部来维护,同时服务进程自行调度不同请求的处理顺序,这样避免了传统多线程并发方式新建、销毁以及系统调度处理线程的开销。基于这样的考虑我们选择了基于Tornado框架实现api服务的开发。Tornado的实现非常简洁明了,使用python的生成器作为协程,利用IOLoop实现了调度队列。

第二个问题是数据库的性能,这里说的数据库包括MongoDB和Redis,我这里分开讲。

先讲MongoDB的问题,MongoDB主要存储不同的用户对于验证的不同设置,比如该显示什么样的图片。
一开始每次验证请求都会查询MongoDB,当时我们的MongoDB是纯内存的,同时三台机器组成一个复制集,这样的组合大概能稳定承载八九千的qps,后来随着我们验证量越来越大,这个承载能力逐渐就成为了我们的瓶颈。
为了彻底搞定这个问题,我们提出了最极端的解决方案,干脆直接把数据库中的数据完全缓存到服务进程里定期批量更新,这样查询的开销将大大降低。但是因为我们用的是Python,由于GIL的存在,在8核服务器上会fork出来8个服务进程,进程之间不像线程那么方便,所以我们基于mmap自己写了一套伙伴算法构建了一个跨进程共享缓存。自从这套缓存上线之后,Mongodb的负载几乎变成了零。
说完了MongoDB再说Redis的问题,Redis代码简洁、数据结构丰富、性能强大,唯一的问题是作为一个单进程程序,终究性能是有上限的。
虽然今年Redis发布了官方的集群版本,但是经过我们的测试,认为这套分布式方案的故障恢复时间不够优秀并且运维成本较高。在Redis官方集群方案面世之前,开源世界有不少proxy方案,比如Twtter的TwemProxy和豌豆荚的Codis。这两种方案测试完之后给我们的感觉TwemProxy运维还是比较麻烦,Codis使用起来让人非常心旷神怡,无论是修改配置还是扩容都可以在配置页面上完成,并且性能也还算不错,但无奈当时Codis还有比较严重的BUG只能放弃之。
几乎尝试过各种方案之后,我们还是下决心自己实现一套分布式方案,目的是高度贴合我们的需求并且运维成本要低、扩容要方便、故障切换要快最重要的是数据冗余一定要做好。
基于上面的考虑,我们确定基于客户端的分布式方案,通过zookeeper来同步状态保证高可用。具体来说,我们修改Redis源码,使其向zookeeper注册,客户端由zookeeper上获取Redis服务器集群信息并根据统一的一致性哈希算法来计算数据应该存储在哪台Redis上,并在哈希环的下一台Redis上写入一份冗余数据,当读取原始数据失败时可以立即尝试读取冗余数据而不会造成服务中断。

❷ 如何在 Python 中进行跨进程跨脚本同步

既然是两个脚本,想必就是两个 python 进程了
IPC 的话基本没有简单的解决方案= =
基本上简单的就是文件和端口了吧= =
跨平台的话,像你说的 Windows 有 mutex 的接口,但是 linux 还有 mmap 呢,不过这两个都不能算跨平台了

❸ 有文件A.py和B.py,在A中使用StringIO.StringIO(),写入一些文本至缓存,那么B如何获得并修改

按照你的说法“两个文件互不引用包含”,就相当于是两个独立执行的程序,但是由于StringIO是内存buffer,所以无法直接被其它程序使用。
而,你的需求“也不要创建具体的文件(如txt、csv等等),只是通过操作内存来实现”是不靠谱的。
如果可以创建文件,你可以将A中内存通过mmap(IPC进程间通信的一种方式,python有这个模块)的映射到一个文件,B程序访问这个文件就相当于访问A的内存

android 手机 地图 定位 编程 如何获取 定位的地点 的图片 和 文字 信息

最近开发中使用的是网络地图android SDK:
1、初始化地图
2、注册定位监听器,初始化Location模块
3、初始化定位图层;启用定位,启用指南针,最后把定位图层添加到地图中。附简单代码:

//mMapView = (MapView) findViewById(R.id.bmapsView);
mMapView = new MapView(this); //初始化一个mapView 存放Map
mMapView.setBuiltInZoomControls(true);// 设置启用默认的缩放控件

locationManager = mBMapMan.getLocationManager();
/*
* 由于LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,
* 在LocationListener获取第一个更精确的位置之前,应当使用getLocationInfo() 获取一个缓存的位置
*/
Location location = locationManager.getLocationInfo();
locationManager.requestLocationUpdates(this);

mMapController = mMapView.getController();// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
if (location != null) {
mMapController.setCenter(new GeoPoint(
(int) (location.getLatitude() * 1E6), (int) (location
.getLongitude() * 1E6)));
}
mMapController.setZoom(12);// 设置地图zoom级别

MyLocationOverlay mylocTest = new MyLocationOverlay(this, mMapView);
mylocTest.enableMyLocation();
mylocTest.enableCompass();
mMapView.getOverlays().add(mylocTest);
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub

if (location != null) {
mMapController.animateTo(new GeoPoint(
(int) (location.getLatitude() * 1E6), (int) (location
.getLongitude() * 1E6)));
}
}

如果你想点击定位地点,显示信息,你需要去扩展MyLocationOverlay图层,它里面有个public boolean onTap(GeoPoint p, MapView map) {}方法,是处理点击事件的。

有问题,可以与我联系,共同探讨。

❺ 如何将jpg或bmp转换成mmap格式

由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。

Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的的函数。

一、进程控制:

fork 创建一个新进程

clone 按指定条件创建子进程

execve 运行可执行文件

exit 中止进程

_exit 立即中止当前进程

getdtablesize 进程所能打开的最大文件数

getpgid 获取指定进程组标识号

setpgid 设置指定进程组标志号

getpgrp 获取当前进程组标识号

setpgrp 设置当前进程组标志号

getpid 获取进程标识号

getppid 获取父进程标识号

getpriority 获取调度优先级

setpriority 设置调度优先级

modify_ldt 读写进程的本地描述表

nanosleep 使进程睡眠指定的时间

nice 改变分时进程的优先级

pause 挂起进程,等待信号

personality 设置进程运行域

prctl 对进程进行特定操作

ptrace 进程跟踪

sched_get_priority_max 取得静态优先级的上限

sched_get_priority_min 取得静态优先级的下限

sched_getparam 取得进程的调度参数

sched_getscheler 取得指定进程的调度策略

sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度

sched_setparam 设置进程的调度参数

sched_setscheler 设置指定进程的调度策略和参数

sched_yield 进程主动让出处理器,并将自己等候调度队列队尾

vfork 创建一个子进程,以供执行新程序,常与execve等同时使用

wait 等待子进程终止

wait3 参见wait

waitpid 等待指定子进程终止

wait4 参见waitpid

capget 获取进程权限

capset 设置进程权限

getsid 获取会晤标识号

setsid 设置会晤标识号

二、文件系统控制

1、文件读写操作

fcntl 文件控制

open 打开文件

creat 创建新文件

close 关闭文件描述字

read 读文件

write 写文件

readv 从文件读入数据到缓冲数组中

writev 将缓冲数组里的数据写入文件

pread 对文件随机读

pwrite 对文件随机写

lseek 移动文件指针

_llseek 在64位地址空间里移动文件指针

p 复制已打开的文件描述字

p2 按指定条件复制文件描述字

flock 文件加/解锁

poll I/O多路转换

truncate 截断文件

ftruncate 参见truncate

umask 设置文件权限掩码

fsync 把文件在内存中的部分写回磁盘

2、文件系统操作

access 确定文件的可存取性

chdir 改变当前工作目录

fchdir 参见chdir

chmod 改变文件方式

fchmod 参见chmod

chown 改变文件的属主或用户组

fchown 参见chown

lchown 参见chown

chroot 改变根目录

stat 取文件状态信息

lstat 参见stat

fstat 参见stat

statfs 取文件系统信息

fstatfs 参见statfs

readdir 读取目录项

getdents 读取目录项

mkdir 创建目录

mknod 创建索引节点

rmdir 删除目录

rename 文件改名

link 创建链接

symlink 创建符号链接

unlink 删除链接

readlink 读符号链接的值

mount 安装文件系统

umount 卸下文件系统

ustat 取文件系统信息

utime 改变文件的访问修改时间

utimes 参见utime

quotactl 控制磁盘配额

三、系统控制

ioctl I/O总控制函数

_sysctl 读/写系统参数

acct 启用或禁止进程记账

getrlimit 获取系统资源上限

setrlimit 设置系统资源上限

getrusage 获取系统资源使用情况

uselib 选择要使用的二进制函数库

ioperm 设置端口I/O权限

iopl 改变进程I/O权限级别

outb 低级端口操作

reboot 重新启动

swapon 打开交换文件和设备

swapoff 关闭交换文件和设备

bdflush 控制bdflush守护进程

sysfs 取核心支持的文件系统类型

sysinfo 取得系统信息

adjtimex 调整系统时钟

alarm 设置进程的闹钟

getitimer 获取计时器值

setitimer 设置计时器值

gettimeofday 取时间和时区

settimeofday 设置时间和时区

stime 设置系统日期和时间

time 取得系统时间

times 取进程运行时间

uname 获取当前UNIX系统的名称、版本和主机等信息

vhangup 挂起当前终端

nfsservctl 对NFS守护进程进行控制

vm86 进入模拟8086模式

create_mole 创建可装载的模块项

delete_mole 删除可装载的模块项

init_mole 初始化模块

query_mole 查询模块信息

*get_kernel_syms 取得核心符号,已被query_mole代替

四、内存管理

brk 改变数据段空间的分配

sbrk 参见brk

mlock 内存页面加锁

munlock 内存页面解锁

mlockall 调用进程所有内存页面加锁

munlockall 调用进程所有内存页面解锁

mmap 映射虚拟内存页

munmap 去除内存页映射

mremap 重新映射虚拟内存地址

msync 将映射内存中的数据写回磁盘

mprotect 设置内存映像保护

getpagesize 获取页面大小

sync 将内存缓冲区数据写回硬盘

cacheflush 将指定缓冲区中的内容写回磁盘

五、网络管理

getdomainname 取域名

setdomainname 设置域名

gethostid 获取主机标识号

sethostid 设置主机标识号

gethostname 获取本主机名称

sethostname 设置主机名称

六、socket控制

socketcall socket系统调用

socket 建立socket

bind 绑定socket到端口

connect 连接远程主机

accept 响应socket连接请求

send 通过socket发送信息

sendto 发送UDP信息

sendmsg 参见send

recv 通过socket接收信息

recvfrom 接收UDP信息

recvmsg 参见recv

listen 监听socket端口

select 对多路同步I/O进行轮询

shutdown 关闭socket上的连接

getsockname 取得本地socket名字

getpeername 获取通信对方的socket名字

getsockopt 取端口设置

setsockopt 设置端口参数

sendfile 在文件或端口间传输数据

socketpair 创建一对已联接的无名socket

七、用户管理

getuid 获取用户标识号

setuid 设置用户标志号

getgid 获取组标识号

setgid 设置组标志号

getegid 获取有效组标识号

setegid 设置有效组标识号

geteuid 获取有效用户标识号

seteuid 设置有效用户标识号

setregid 分别设置真实和有效的的组标识号

setreuid 分别设置真实和有效的用户标识号

getresgid 分别获取真实的,有效的和保存过的组标识号

setresgid 分别设置真实的,有效的和保存过的组标识号

getresuid 分别获取真实的,有效的和保存过的用户标识号

setresuid 分别设置真实的,有效的和保存过的用户标识号

setfsgid 设置文件系统检查时使用的组标识号

setfsuid 设置文件系统检查时使用的用户标识号

getgroups 获取后补组标志清单

setgroups 设置后补组标志清单

八、进程间通信

ipc 进程间通信总控制调用

1、信号

sigaction 设置对指定信号的处理方法

sigprocmask 根据参数对信号集中的信号执行阻塞/解除阻塞等操作

sigpending 为指定的被阻塞信号设置队列

sigsuspend 挂起进程等待特定信号

signal 参见signal

kill 向进程或进程组发信号

*sigblock 向被阻塞信号掩码中添加信号,已被sigprocmask代替

*siggetmask 取得现有阻塞信号掩码,已被sigprocmask代替

*sigsetmask 用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替

*sigmask 将给定的信号转化为掩码,已被sigprocmask代替

*sigpause 作用同sigsuspend,已被sigsuspend代替

sigvec 为兼容BSD而设的信号处理函数,作用类似sigaction

ssetmask ANSI C的信号处理函数,作用类似sigaction

2、消息

msgctl 消息控制操作

msgget 获取消息队列

msgsnd 发消息

msgrcv 取消息

3、管道

pipe 创建管道

4、信号量

semctl 信号量控制

semget 获取一组信号量

semop 信号量操作

5、共享内存

shmctl 控制共享内存

shmget 获取共享内存

shmat 连接共享内存

shmdt 拆卸共享内存

❻ 如何对mmap区域的数据进行加锁

如果内存映射文件是将文件全部读取到内存中,那么“内存映射文件”和你直接从文件读取数据,全部装入内存就没有区别了,内存映射文件也就没有存在的意义了。 内存映射文件的原理是通过数据访问局部性这个原理来提高性能的。什么叫数据访问局部性呢?我们从统计学意义上分析,如果你读取文件中某个地方的数据,那么你接下来读取的数据在之前读取地址附近的概率,要比读取很远的地方的数据的概率要高。 那么,如果操作系统得到请求,你要获取某个数据,它在读取这个数据的时候,顺带手将这一块的数据都读取到内存中。也许接下来很不幸,你读取的数据不在操作系统预取的范围内,但是这是少数情况。多数情况是,你接下来再读的数据,内存中已经有了,此时操作系统无需再访问磁盘,直接从内存中返回。 虽然这比一次性全部读进内存,100%的数据都能访问到要稍微逊色一些,但是我们用很经济的代价(可能只要原数据10%的内存)得到了近乎完美的性能(和完全读到内存相比性能可能相差10%)。 是不是这样一来性能就提高了?内存映射文件的含义就是,操作系统透明处理了很多加载、更新、回写缓存的操作,使得开发者看上去像是读取文件,但是结果是更快实现了IO的存取。同时又避免数据过大不能一次性读取到内存的问题。

❼ 如何实现 C/C++ 与 Python 的通信

引入Python可以带来更好的可调式性。且如果重负载应用使用C/C++则基本没有性能损失,并可以让工程师把更多精力放在算法优化获得性能优势上。

简单讲Python与C/C++的直接交互就是两种方向:C/C++写扩展模块给Python调用;将Python嵌入C/C++。题主说的是后者。而更方便方式是前者。因为内嵌方式决定了你整个交互部分开发完成之前没法做测试。而扩展模块方式则可以先行用Python快速开发出大部分功能,有需要性能优化的部分逐步优化到C/C++。是更加渐进式的过程。
直接用最基础的方法写扩展模块略有繁杂,适合对细节的控制。题主时间紧迫则可以考虑Cython,可以在较短时间里完成些任务。但更多高级功能的玩法则限制很多。
其他交互方式还有多种,性能就不是那么高了。比如fork()子进程,用管道通信。开独立进程走mmap()交互,甚至是本机或其他机器上走socket。
最后,C++做了很多底层抽象,使得其与其他编程语言的互调用方面麻烦的要死。比较典型的包括类继承,运算符重载,引用,其他还有太多。这些特性使得其他语言调用C++时各种恶心。这不仅仅是对Python,而是对所有语言都是如此。不信试试在C程序里调用一个C++运算符重载过的方法。所以,如非必要,尽量别用C++。用C简单方便的多,而任何用以支持大规模项目的架构用Python就是了。

❽ 哪位大神有python版的完整的bloom filter实现过程,感谢!

Python实现以及使用
代码实现网上有很多,有时间可以研究一下
使用:我下载了github上的模块,使用mmap速度更快。
通俗点儿来讲:
1、该句引入模块
from pybloomfilter import BloomFilter

2、Reference如下
常用的函数有:
class pybloomfilter.BloomFilter(capacity : int, error_rate : float, filename : string)
static BloomFilter.open(filename)
BloomFilter.add(item) → Boolean
BloomFilter.clear_all()
BloomFilter.(filename) → BloomFilter
BloomFilter.update(iterable)
BloomFilter.__len__(item) → Integer
BloomFilter.__in__(item) → Boolean

❾ 学嵌入式linux需要先学什么

刚入门的时候,淘宝买一块cortex m3开发板即可入手,通过项目,你需要了解:任务调度、进程间通信、内存管理、设备驱动、文件系统、TCP/IP协议栈、同步异步、中断、软件架构插件化等等基本原理,这些对你后面转Linux应用开发,安卓开发,后台开发大有好处。

到这一步,就看自己职业方向想往哪里发展,如果是想深入IOT物联网做端云连接,那么可以把几种基本总线驱动,I2C、SPI、USART理解透,如果是想拥抱互联网转入应用开发,那么可以把基础组件,如协议栈、文件系统吃透,BAT面试不是很难,问的都是这些基础。

顺便说一下,学东西就要学对市场有用的,不要过于学习屠龙之术,炫技给个人带来不了财富,公司需要的是能干活的人。

不准备讲过于偏硬件的知识如Cortex-M3的多种中断模式,操作寄存器组,芯片降噪等内容,而是专注于操作系统基本知识和项目经验,这些对于开发者后面接触Linux系统大有脾益,这些软件开发经验也是去互联网公司看重的能力。如有需要学习Linux命令请如下查找:

❿ 如何交叉编译Python到ARM-Linux平台

编译sqlite

先去 http://www.sqlite.org/download.html 下载最新的sqlite源代码,我这里用的是3.5.6版本的。

我推荐使用amalgamation版本的源代码,这个代码只有几个文件而已,编译起来方便,而且据说 编译器好的话,还可能编译出更高效的代码。 我下载的是

[plain]
view plain

http://www.sqlite.org/sqlite-amalgamation-3.5.6.tar.gz

先运行以下几步:

[plain]
view plain

tar zxf sqlite-amalgamation-3.5.6.tar.gz
cd sqlite-3.5.6
./configure --host=arm-linux --prefix=/usr/local/arm/3.3.2 --enable-shared --disable-readline --disable-dynamic-extensions

以上是把sqlite解压缩,然后做一些配置,这里,我希望sqlite到时候安装到/usr/local/arm/3.3.2里,要生成动态链接库,不要readline,不要sqlite的动态扩展。

然后编辑Makefile,把CFLAG和CXXFLAG中的-g去掉,我们不用debug sqlite。

接下来就可以编译和安装sqlite了:

[plain]
view plain

make
make install

这一步就完成了sqlite的编译和安装了。

编译python

先去http://www.python.org/download/下载最新版本的python源代码,我这里下载的是:

[plain]
view plain

http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2

先把python解压缩:

[plain]
view plain

tar jxf Python-2.5.1.tar.bz2
cd Python-2.5.1

编译pc版本的语法解析器

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:

[plain]
view plain

mkdir build.pc
cd build.pc
../configure
make Parser/pgen

然后ls Parser一下,应该就能看到有pgen了。

修改configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于

[plain]
view plain

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

结束于

[plain]
view plain

cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把这两段以及中间的内容都删除掉就可以了。

编译arm版本的python

有了语法解析器,就可以开始编译arm版本的python了。

[plain]
view plain

mkdir ../build.arm
cd ../build.arm
../configure --prefix=/home/leojay/test/arm-system-working/rootfs --disable-ipv6 --host=arm-linux --enable-shared

先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用arm-linux的编译器,生成动态链接库。

修改Makefile

之后就要对Makefile做一些修改,把

[plain]
view plain

OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。



[plain]
view plain

PGEN= Parser/pgen$(EXE)

一行的下面加上

[plain]
view plain

PGEN_HOST= ../build.pc/Parser/pgen$(EXE)

表明我们在HOST上运行的pgen

在要使用PGEN的地方改为PGEN_HOST:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

修改所有使用新生成的python的地方。

所有如 ./$(BUILDPYTHON) 的地方,都改为python

如:

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改为

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

这种地方比较多,大家小心修改。

修改setup.py

setup.py负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。

PyBuildExt类:

函数的前两行是把/usr/local加到搜索目录中,我们的cross compiler一般不会直接安装在 /usr/local里面的,所以这两行去掉:

[plain]
view plain

lib_dirs, inc_dirs的设定中,把中括号里的那些都去掉。 以下所有模块都不要:
这个函数在编译了所有的extension后,会去load这些刚编译好的extension, 但我们在i686的电脑上显然不能load,所以要跳过这些操作。 在 build_ext.build_extension(self, ext)后面直接写一个return,不做load。
for d in ['/usr/local/arm/3.3.2/include']
for d in inc_dirs + sqlite_inc_paths:
ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
build_extension函数:
detect_moles函数:
cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,

[plain]
view plain

由于python本身的问题,现在ctypes还不能在除i386以外的机器上运行,所以ctypes也去掉 编译sqlite的地方:

[plain]
view plain

改为:

[plain]
view plain

因为我的sqlite3安装在这里,如果这里不改的话,setup.py会在我的电脑上找sqlite

main函数:
setup函数调用的时候,把要安装的scripts那一部分去掉

之后就可以make && make install了。

附上我修改后的 Makefile 和 setup.py 供大家参考

裁减python

python完全安装后,实在是很大,所以,要把一些肯定用不上的库去掉。 所以,再附上我的裁减脚本 cleanpy.sh

注意,由于我的python程序都运行在python -OO的参数下,所有的.py和.pyc都不需要, 只要有.pyo就可以了。所以,这个脚本会把所有的.py和.pyc都删除掉。

大家可以根据自己的需要做调整。

阅读全文

与pythonmmap模块相关的资料

热点内容
脉脉app干什么用的 浏览:357
拽姐是哪个app 浏览:858
云服务器删除了还有吗 浏览:232
macbook可以用单片机嘛 浏览:307
南阳php招聘 浏览:814
去哪里找按摩师很漂亮的app 浏览:818
86x99用简便算法计算 浏览:830
php截图flash 浏览:274
卸载联想app哪个好 浏览:720
php文字转图片 浏览:332
豆客后台怎么加密码 浏览:574
jpg转换pdf破解版 浏览:978
php基础书籍推荐 浏览:778
服务器与外网不通如何验证 浏览:353
电子版是不是就是文件夹 浏览:51
游戏属性文件加密 浏览:464
如何让安卓手机桌面图标下移 浏览:530
ubuntuphp5环境搭建 浏览:101
赌瘾解压视频 浏览:919
晋城移动dns服务器地址 浏览:296