各位老铁们,大家好,今天由我来为大家分享python动态改代码,以及python动态运行py代码的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了下面我们开始吧!
在Python编程的世界里,代码的编写和修改是程序员们每天都要面对的课题。我们可能会因为一些小小的改动而花费大量的时间,甚至重写整个代码。而我要向大家介绍一种高效的方法——Python动态改代码,让你的编程生活变得更加轻松愉快!
什么是Python动态改代码?
Python动态改代码,顾名思义,就是指在运行过程中对代码进行修改和调整。这种做法可以大大提高编程效率,减少重复劳动。在Python中,我们可以通过以下几种方法实现动态改代码:
1. 使用装饰器(Decorators):装饰器是Python中的一种非常强大的功能,它可以让我们在不修改原函数的基础上,对函数进行扩展。通过装饰器,我们可以实现对函数的动态修改。
2. 使用类和方法:在Python中,类和方法提供了更灵活的代码修改方式。通过在类中添加或修改方法,我们可以实现对代码的动态修改。
3. 使用内置函数和模块:Python内置了大量的函数和模块,这些函数和模块可以帮助我们轻松实现代码的动态修改。
装饰器:代码修改的利器
让我们以装饰器为例,看看如何实现Python动态改代码。
示例:
```python
def my_decorator(func):
def wrapper():
print("
python敲代码敲错了怎么修改
具体如下。
打开PYTHON自带的IDE,也就是SHELL。如果我们输入错误信息会提示红色。这个时候把光标移动到错误的那一行代码上,点击ENTER。然后就会自动生成新的一行代码出来。我们在这个的基础上修改即可,然后点击ENTER即可输出正确的结果。
Python由荷兰数学和计算机科学研究学会的GuidovanRossum于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
如何使用Python动态控制Linux系统的内存占用百分比
如何使用Python动态控制Linux系统的内存占用百分比?
近期有网上朋友寻求帮助:如何通过脚本动态控制Linux系统的内存占用百分比?经过一番百度+编写调试,终于初步完成了动态控制Linux系统内存占用百分比。现写出来以帮助更多的朋友。
1
根据需求是动态控制Linux系统内存占用百分比,比如当前内存占用30%,如果设置内存占用为70%,则需要申请内存使达到占用70%;如果再降低到40%,则需要释放部分申请的内存。其实脚本的本质是内存动态申请与释放。
注意:因为Python脚本运行之前内存有一定占用,故设定内存占用不能低于该百分比。
2内存动态申请
通过查询资料,使用Python动态申请内存块,可以使用ctypes包中的函数,导入包及代码如下所示:
>>> from ctypes import
>>> mem=create_string_buffer(1024)
说明:内存申请使用create_string_buffer()函数,上面申请了1024字节的内存块。
下面演示申请100MB内存前后变化
申请前如下图所示:
使用代码如下:
>>>mem=create_string_buffer(104857600)
申请后如下图所示:
从上述两幅图中可以看出,申请内存前内存占用295MB,申请后内存占用397MB,增加了约100MB内存占用。
3内存动态释放
由于Python对内存是有垃圾回收机制的,采用对象引用计数方式。当对象的引用计数为0时,启动垃圾回收GC。此处内存动态释放就是使用该原理。
代码如下:
>>> mem=None
释放后内存占用如下图所示:
内存占用由397MB降低到297MB,释放了100MB内存占用。
说明:将None赋值给对象mem后,mem对象的引用计数即为0,此时垃圾回收启动,释放mem对象占用的内存。
4系统总内存、占用内存检测
由于需要设定内存占用百分比,故需要获取系统总物理内存和占用内存。本文使用的方法是读取系统文件“/proc/meminfo”,从中解析出总内存大小以及当前内存占用大小等内存相关的信息。该文件内容格式如下图所示:
代码片段如下所示:
f= open("/proc/meminfo")
lines= f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name= line.split(&39;:&39;)[0]
var= line.split(&39;:&39;)[1].split()[0]
mem[name]= long(var) 1024.0
mem[&39;MemUsed&39;]= mem[&39;MemTotal&39;]- mem[&39;MemFree&39;]
说明:按行读取meminfo文件内容,创建字典对象mem,将meminfo文件第一列设置为mem对象的键值,将meminfo文件第二列数字设置为mem对象的值。
5获取用户输入百分比
通过读取键盘输入字符串,然后转换为数字实现接收用户输入的百分比,代码如下所示:
input_str=raw_input("Input UsedMemory`s Rate or q to exit:")
rate=float(input_str)
注意:此处键盘输入的都是字符串,需要进行字符串转换为数字,使用float()或long()函数进行转换。
6动态设置内存占用百分比测试
测试使用两个Python脚本文件,分别是test.py和mem_rate.py,其功能分别是查看当前内存占用和动态设定内存占用百分比。如下图所示:
注意:上述两个文件需要使用“chmod+x.py”修改为可执行属性。
6.1查看当前内存占用
查看当前内存占用百分比,使用上述test.py文件,运行命令为“./test.py”,运行结果如下图所示:
当前使用内存为320MB,占用百分比为17%。
6.2动态设置内存占用百分比
动态设置内存占用百分比使用上述mem_rate.py脚本,注意该脚本文件第一行代码为“!/usr/bin/python2.6”,表示该脚本使用python2.6程序运行。该行需要修改为待运行Linux系统中Python实际的安装程序路径。
动态内存百分比设置界面如下图所示:
处于待输入状态。另外显示了当前内存占用(321MB),总内存大小(1869MB)以及内存占用百分比(17%)。
如果此时设置内存占用百分比为80%,则脚本会每次申请10MB空间,直至内存占用接近或等于80%为止。如下图所示:
内存申请过程如下图所示:
内存申请过程中占用百分比变化为:35%,45%,56%,70%,…
mem_rate.py运行过程如下图所示:
内存申请过程中占用变化为:1461MB,1471MB,1481MB,1491MB。
此时如果内存占用百分比设置为20%,则需要释放一部分内存。
test.py脚本运行过程如下图所示:
由于释放内存运行较快,抓取到最后结果
内存占用为20%。
mem_rate.py脚本运行过程如下图所示:
内存释放过程中内存占用为:413MB,403MB,393MB,383MB,最后内存占用稳定在20%,383MB。
输入“q”或“Q”退出内存占用百分比设定过程,如下图所示:
此时内存占用如下图所示:
内存占用恢复到运行mem_rate.py脚本之前状态,17%,321MB。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
附:完整Python脚本代码
test.py
------------------------------------------------------------------------------------------------
!/usr/bin/python2.6
def memory_stat():
mem={}
f= open("/proc/meminfo")
lines= f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name= line.split(&39;:&39;)[0]
var= line.split(&39;:&39;)[1].split()[0]
mem[name]= long(var) 1024.0
mem[&39;MemUsed&39;]= mem[&39;MemTotal&39;]- mem[&39;MemFree&39;]
- mem[&39;Buffers&39;]- mem[&39;Cached&39;]
return mem
mem=memory_stat()
print("Used(MB):%d"%(long(mem[&39;MemUsed&39;])/1024/1024))
print("Rate:%d%%"%(100long(mem[&39;MemUsed&39;])/float(mem[&39;MemTotal&39;])))
§§§§§§§§§§§§§§§§§§§§§§§§§§
mem_rate.py
---------------------------------------------------
!/usr/bin/python2.6
from ctypes import
Get Memory Info(Total, Used... Byte)
def get_memory_stat():
mem={}
f= open("/proc/meminfo")
lines= f.readlines()
f.close()
for line in lines:
if len(line)< 2:continue
name= line.split(&39;:&39;)[0]
var= line.split(&39;:&39;)[1].split()[0]
mem[name]= long(var) 1024.0
mem[&39;MemUsed&39;]= mem[&39;MemTotal&39;]- mem[&39;MemFree&39;]
Return MemroyInfo Object
return mem
Get Simple Memory Info
def get_memory_info(mem):
Byte-> MB
n=1024 1024
used=float(mem[&39;MemUsed&39;])/ n
total=float(mem[&39;MemTotal&39;])/ n
rate=used/total 100
smp={&39;used&39;:used,&39;total&39;:total,&39;rate&39;:rate}
return smp
Display Current Memory Info
def print_memory_info(mem):
Get SimpleMemory Info
smp=get_memory_info(mem)
print("Used(MB):%d&92;tTotal(MB):%d&92;tUsedRate:%d%%"%(smp[&39;used&39;], smp[&39;total&39;], smp[&39;rate&39;]))
Get Rate Of Memory Used To Be Setted(Integer Formate)
def input_memory_used_rate(org_rate):
Byte-> MB
n=1024 1024
while(True):
mem=get_memory_stat()
print_memory_info(mem)
input_str=raw_input("Input UsedMemory`s Rate or q to exit:")
if(len(input_str)== 0):
continue
if("q"== input_str):
info={&39;rate&39;:0,&39;used&39;:mem[&39;MemUsed&39;]/ n}
return info
if("Q"== input_str):
info={&39;rate&39;:0,&39;used&39;:mem[&39;MemUsed&39;]/ n}
return info
try:
rate=float(input_str)
if((rate>=org_rate)and(rate<=95)):
info={&39;rate&39;:rate,&39;used&39;:mem[&39;MemUsed&39;]/ n}
return info
else:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))
except:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))
Set Rate Of Memory Used
def set_memory_used_rate(new_rate, total, pre_used,list):
if(new_rate==0):
return None
dest_mem=total new_rate/100.0
10MB
mb10=10485760
n_chg=10
Free Memory OrAllocate Memory?
is_new=dest_mem>pre_used
cur_used=pre_used
while(True):
To Calc FreeMemory Or Allocate Memory?
need_new=dest_mem-n_chg>=pre_used
need_del=dest_mem+n_chg<=pre_used
Need To AllocateMemory
if(is_new):
if(need_new):
p=create_string_buffer(mb10)
list.append(p)
dest_mem=dest_mem-n_chg
cur_used=cur_used+n_chg
else:
return"end"
Need To FreeMemory
else:
idx=len(list)-1
if(need_deland(idx>=0)):
p=list[idx]
del list[idx]
p=None
dest_mem=dest_mem+n_chg
cur_used=cur_used-n_chg
else:
return"end"
print(" MemoryUsed(MB):%d"%(cur_used))
Entry Of Program
List Of Memory Object, 10MB Of One Object
list=[]
Get Current Memory Info
mem=get_memory_stat()
Get Simple Memory Info
smp=get_memory_info(mem)
org_rate=smp[&39;rate&39;]
total=smp[&39;total&39;]
while(True):
Get Rate OfMemory To Be Used
info=input_memory_used_rate(org_rate)
new_rate=float(info[&39;rate&39;])
pre_used=float(info[&39;used&39;])
Set Rate OfMemory To Be Used
rtn=set_memory_used_rate(new_rate, total, pre_used, list)
if(not rtn):
print("bye!")
exit()
如何让python调用C和C++代码
要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<<Extending&& embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<<Python Programming On Win32>>书中找到了教程。
1.首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为:import mbmb.showMsg("Python&39;s really amazing, I kindda love it!")
2.搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。
在vs 2005下点击菜单"工具"->"选项",打开选项对话框,选择"项目和解决方案->VC++目录",然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。
既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:
include<python.h>//python.h是包含python一些定义的头文件,在python的include目录下/我的python版本是2.5,因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,
想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息/pragma comment(lib,"python25.lib")//先不管static PyObject mb_showMsg(PyObject self, PyObjectargs);/如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用
extern"C" __declspec(dllexport) void initmb(){/当调用mb.showMsg("Python&39;s really amazing, I kindda love it!")时,相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key=> showMsg, value=>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧/static PyMethodDef mbMethods[]={
{"showMsg", mb_showMsg, METH_VARARGS},
{NULL, NULL, NULL}/sentinel,哨兵,用来标识结束/};//告诉python我们的模块名叫mb,模块包含的函数都在mbMethods字典里
PyObjectm= Py_InitModule("mb", mbMethods);}/接下来实现核心功能showMsg///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple
static PyObject mb_showMsg(PyObject self, PyObjectargs){//我们的showMsg函数需要的是一个字符串参数
const char msg= NULL;/调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,
如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,
这个函数的原型是类似printf的不定参数的形式
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject, const char,...);/if(!PyArg_ParseTuple(args,"s",&msg))
return NULL;//调用MBint r=::MessageBox(NULL,"hello","Caption:Form C module", MB_IConINFORMATION| MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb.showMsg("Python&39;s really amazing, I kindda love it!")
文章到此结束,如果本次分享的python动态改代码和python动态运行py代码的问题解决了您的问题,那么我们由衷的感到高兴!
