自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程菜鸟iglesias的博客

一个编程菜鸟的学习里程

  • 博客(192)
  • 收藏
  • 关注

原创 第十七章:运行时特性-gc:垃圾回收器-调试

17.6.5 调试调试内存泄漏可能很有难度。gc包括有一些选项,可以提供代码的内部工作情况,使这个任务更为简单。这些选项都是位标志,可以组合传递到set_debug(),在程序运行时配置垃圾回收器。调试信息被打印到sys.stderr。DEBUG_STATS标志打开统计报告。这会使垃圾回收器报告它何时运行、每一代跟踪的对象数以及完成清扫花费的时间。import gcgc.set_debu...

2019-07-31 20:32:23 192

原创 第十七章:运行时特性-gc:垃圾回收器-回收阈值和代

17.6.4 回收阈值和代垃圾回收器会维护它运行时看到的3个对象列表,分别对应回收器跟踪的各“代”(generation)。在各代中检查对象时,这些对象要么被收回,要么变老进入下一代,直至最终达到永久保存的阶段。根据回收器运行之间对象分配数和撤销数之差,可以调整回收器例程,按不同的频率运行。如果分配数减去撤销数大于当前这一代的阈值,则运行垃圾回收器。当前值可以用get_threshold()检...

2019-07-31 19:52:37 425

原创 第十七章:运行时特性-gc:垃圾回收器-查找无法回收的对象引用

17.6.3 查找无法回收的对象引用要在垃圾列表中查找哪个对象包含另一个对象的引用,这比查看一个对象引用了什么要麻烦一些。因为查找引用的代码本身也需要包含引用,所以需要忽略一些包含引用的对象(引用者)。下面这个例子创建了一个图环,然后处理Graph实例,并删除"父"节点中的引用。import gcimport pprintclass Graph: def __init__(s...

2019-07-31 19:15:28 268

原创 第十七章:运行时特性-gc:垃圾回收器-强制垃圾回收

17.6.2 强制垃圾回收尽管解释器执行一个程序时会自动运行垃圾回收器,但是如果需要释放大量对象,或者如果当时没有太多工作,那么相应地回收器在不影响应用性能的情况下也可以触发垃圾回收站,让它在一个特定的时间运行。可以使用collect()触发垃圾回收。import gcimport pprintclass Graph: def __init__(self,name): ...

2019-07-31 18:52:20 263

原创 第十七章:运行时特性-gc:垃圾回收器-跟踪引用

17.6 gc:垃圾回收器gc提供了Python的底层内存管理机制,即自动垃圾回收器。这个模块包括一些函数,可以控制回收器如何操作,以及如何检查系统已知的对象,这些对象可能在等待收集,也可能已陷入引用环而无法释放。17.6.1 跟踪引用利用gc,可以使用对象之间来回的引用来查找复杂数据结构中的环。如果已知一个数据结构中存在环,那么可以使用定制代码来检查它的属性。如果环在未知代码中,则可以使用...

2019-07-31 18:38:44 342 1

原创 第十七章:运行时特性-resource:系统资源管理-资源限制

17.5.2 资源限制除了当前实际使用的资源外,还可以检查对应用的限制,然后做出修改。import resourceLIMITS = [ ('RLIMIT_CORE','core file size'), ('RLIMIT_CPU','CPU time'), ('RLIMIT_FSIZE','file size'), ('RLIMIT_DATA','heap...

2019-07-30 20:31:00 348

原创 第十七章:运行时特性-resource:系统资源管理-当前使用情况

17.5 resource:系统资源管理resource中的函数可以检查一个进程消耗的当前系统资源,并作出限制,以控制一个程序对系统可能增加的负载。17.5.1 当前使用情况使用getrusage()来查看当前进程和其子进程使用的资源。返回值是一个数据结构,其中包含当前系统状态下的一些资源度量。说明:这里并没有显示所收集的全部资源值。更完整的列表可以参考resource的标准库文档。im...

2019-07-30 20:01:03 130

转载 第十七章:运行时特性-platform:系统版本信息-可执行程序体系结构

17.4.4 可执行程序体系结构可以使用architecture()函数查看程序的体系结构信息。第一个参数是可执行程序的路径(默认为sys.executable,即Python解释器)。返回值是一个元组,包含位体系结构和使用的链接格式。import platformprint('interpreter:',platform.architecture())print('/bin/ls ...

2019-07-30 19:47:17 114

转载 第十七章:运行时特性-platform:系统版本信息-操作系统和硬件信息

17.4.3 操作系统和硬件信息还可以得到运行解释器的操作系统和硬件的更多详细信息。uname()返回一个元组,其中包含系统、节点、发行号、版本、及其和处理器值。可以通过同名的函数访问各个值,如表17-3所列。import platformprint('uname:',platform.uname())print()print('system :',platform.syste...

2019-07-30 19:42:06 114

转载 第十七章:运行时特性-platform:系统版本信息-平台

17.4.2 平台platform()函数返回一个字符串,其中包含一个同样的平台标识符。这个函数接受两个可选的布尔参数。如果aliased为True,则返回值中的名会从一个正式名转换为更常用的格式。如果terse为True,则会返回一个最小值,即去除某些部分,而不是返回完整的串。import platformprint('Normal :',platform.platform())pri...

2019-07-30 19:30:12 158

转载 第十七章:运行时特性-platform:系统版本信息-解释器

17.4 platform:系统版本信息尽管Python通常被用作一个跨平台的语言,但有时还是有必要知道程序在哪种系统上运行。构建工具需要这个信息,另外应用可能也需要知道它使用的一些库或外部命令在不同操作系统上有不同的接口。例如,一个管理操作系统网络配置的工具可能对网络接口、别名、IP地址和其他OS特定的信息定义了可移植的表示。不过,在编辑配置文件时,它必须对主机有更多了解,从而能使用正确的操作...

2019-07-30 19:24:14 118

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-操作系统错误码

17.3.13 操作系统错误码操作系统定义的错误码(在error模块中管理)可以使用strerror()转换为消息字符串。import errnoimport osfor num in [errno.ENOENT,errno.EINTR,errno.EBUSY]: name = errno.errorcode[num] print('[{num:>2}] {name...

2019-07-30 19:03:42 81

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-Spawn创建新进程

17.3.12 Spawn创建新进程为提供便利,spawn()系列函数可以在一个语句中一次完成fork()和exec()处理。import osos.spawnlp(os.P_WAIT,'pwd','pwd','-P')第一个参数是一个模式,指示返回之前是否等待进程完成。这个例子会等待。使用P_NOWAIT允许另一个进程开始,不过之后会恢复执行当前进程。...

2019-07-30 18:58:12 191

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-等待子进程

17.3.11 等待子进程很多包含大量计算的程序会使用多个进程,以绕开Python的线程限制和全局解释器锁。当启动多个进程来运行不同任务时,主进程开始新的子进程之前需要等待一个或多个子进程完成,以避免服务器负载过大。为此,取决于具体情况,可以使用wait()和相关函数来实现。如果哪个子进程最先退出并不重要,那么可以使用wait()。一旦有子进程退出它就会返回。import osimport...

2019-07-30 18:51:35 85

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-用os.fork()创建进程

17.3.10 用os.fork()创建进程通过os模块提供了POSIX函数fork()和exec()(在Mac OSX,Linux和其他UNIX系统上都可用)。要创建一个新进程作为当前进程的一个克隆,可以使用fork()。import ospid = os.fork()if pid: print('Child process id:',pid)else: print...

2019-07-30 18:29:56 118

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-管理进程工作目录

17.3.8 管理进程工作目录如果操作系统拥有具有层次结构的文件系统,那么其会有一个"当前工作目录"(current working directory)的概念,也就是说,在使用相对路径访问文件时,进程将使用文件系统上的这个目录作为起始位置。当前工作目录可以用getcwd()获取,用chdir()改变。import osprint('Starting:',os.getcwd())pri...

2019-07-29 20:18:56 61

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-管理进程环境

17.3.7 管理进程环境操作系统通过os模块为程序提供的另一个特性是环境。环境中设置的变量作为字符串可见,可以通过os.environ或getenv()来读取这些字符串。环境变量通常用于配置值,如搜索路径、文件位置和调试标志。下面这个例子显示了如何获取一个环境变量,并将一个值传递到一个子进程。import osprint('Initial value:',os.environ.get('...

2019-07-29 20:11:52 84

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-检测和改变进程所有者

17.3.6 检测和改变进程所有者os提供的下一组函数用于确定和改变进程所有者ID。守护进程或一些特殊系统程序(需要改变权限级别而不是作为root运行)的作者最常使用这些函数。下面的例子显示了一个进程的有效用户和组信息,然后改变这些有效值。这类似于系统自引导期间一个守护进程作为root启动时可能要做的工作,比如降低权限等级,以及作为一个不同的用户运行。说明:运行这个例子之前,要改变TEST_...

2019-07-29 19:50:34 130

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-安全地替换现有文件

17.3.5 安全地替换现有文件替换或重命名一个现有文件不是幂等操作(安全操作),可能会导致应用出现竞态条件。reaname()和replace()函数为这些动作实现了安全算法,会尽可能使用POSIX兼容系统上的原子操作。import globimport oswith open('rename_start.txt','w') as f: f.write('starting a...

2019-07-29 19:35:15 115

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-处理符号链接

17.3.4 处理符号链接对于支持符号链接(symlink)的平台和文件系统,还有一些相应的处理函数。import oslink_name = '/tmp/' + os.path.basename(__file__)print('Creating line {} -> {}'.format(link_name,__file__))os.symlink(__file__,link...

2019-07-29 19:24:14 86

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-创建和删除目录

17.3.3 创建和删除目录有很多函数可以用来处理文件系统上的目录,包括串接内容、列出内容和删除目录。import osdir_name = 'os_directories_example'print('Creating',dir_name)os.makedirs(dir_name)file_name = os.path.join(dir_name,'example.txt')...

2019-07-29 19:04:26 85

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-管理文件系统权限

17.3.2 管理文件系统权限可以使用stat()或lstat()访问关于文件的详细信息(lstat()方法用于检查一个可能是符号链接的对象的状态)。import osimport sysimport timeif len(sys.argv) == 1: filename = __file__else: filename = sys.argv[1]stat_inf...

2019-07-29 18:54:31 72

转载 第十七章:运行时特性-os:可移植访问操作系统特定特性-检查文件系统内容

17.3 os:可移植访问操作系统特定特性os模块为平台特定的模块(如posix,nt和mac)提供了一个包装器。所以平台上函数的API都应当是相同的,所以使用os模块可以提供一定的可移植行。不过,并不是所以函数在每一个平台上都可用。具体来说,这个总结中介绍的许多进程管理函数就对Windows不适用。os模块的Python文档的子标题是"杂类操作系统接口"。这个模块主要包括用于创建和管理运行进...

2019-07-27 09:28:01 83

转载 第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-异常传播

17.2.7.4 异常传播可以在一个局部跟踪函数中查找exception事件以监视异常。出现异常时,会调用跟踪hook并提供一个元组,其中包含异常类型、异常对象和一个traceback对象。#!/usr/bin/env python3# encoding: utf-8import sysdef trace_exceptions(frame,event,arg): if ev...

2019-07-27 08:38:05 81

转载 第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-监视栈

17.2.7.3 监视栈使用hook的另一方法是跟踪正则调用哪些函数,以及它们的返回值是什么。为了监视返回值,可以监视return事件。#!usr/bin/env python3# encoding: utf-8import sysdef trace_calls_and_returns(frame,event,arg): co = frame.f_code func_...

2019-07-27 08:25:39 163

转载 第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-跟踪内部函数

17.2.7.2 跟踪内部函数跟踪hook可以返回一个新hook,并在新作用域中使用(局部跟踪函数)。例如,可以控制跟踪,使其只在某些模块或函数中逐行运行。#!/usr/bin/env python3# encoding: utf-8import functoolsimport sysdef trace_lines(frame,event,arg): if event !...

2019-07-27 08:10:23 103

转载 第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-跟踪函数调用

17.2.7 跟踪程序运行情况有两种方法注入代码以监视一个程序的运行,包括跟踪(tracing)和性能分析(profiling)它们很相似,不过分别有不同的用途,所以也有不同的约束。监视一个程序最容易也最低效的方法是通过一个跟踪hook,可以用它来编写一个调试工具,监视代码覆盖,或者达到其他目的。可以向sys.settrace()传递一个回调函数以修改跟踪hook。这个回调接收3个参数:所运行...

2019-07-27 07:51:47 176

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-元路径

17.2.6.11 元路径sys.meta_path进一步扩展了可能的导入来源,允许在扫描常规的sys.path之前先搜索查找工具。元路径上查找工具的API与常规路径上查找工具的API是一样的,只不过元查找工具不限于sys.path中的一项,它可以搜索任何地方。import sysimport impclass NoisyMetaImportFinder: def __ini...

2019-07-26 21:40:02 110

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-导入工具缓存

17.2.6.10 导入工具缓存每次导入一个模块时都要搜宿舍所有hook,这样可能很耗费时间。为了节省时间,会维护一个sys.path_importer_cache,作为路径入口与加载工具(可以使用值查找模块)之间的一个映射。import osimport sysprefix = os.path.abspath(sys.prefix)print('PATH:')for name i...

2019-07-26 21:17:38 112

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-包数据

17.2.6.9 包数据除了定义API来加载可执行的Pyhton代码,PEP 302还定义了一个可选的API以获取包数据,用于发布数据文件、文档和包所需的其他非代码资源。通过实现get_data()。加载工具允许调用应用以获取与包关联的数据,而不用考虑这个包具体如何安装(特别是不用假设这个包作为文件存储在一个文件系统上)。import sysimport sys_shelve_importe...

2019-07-26 21:08:45 100

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-处理导入错误

17.2.6.8 处理导入错误当所有查找工具都无法找到一个模块时,主导入代码会产生一个ImportError。import sysimport sys_shelve_importerfilename = '/tmp/pymotw_import_example.shelve'sys.path_hooks.append(sys_shelve_importer.ShelveFinder)s...

2019-07-26 20:58:23 95

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-在定制导入工具中重新加载模块

17.2.6.7 在定制导入工具中重新加载模块关于重新加载一个模块的处理稍有不同。不是创建一个新的模块对象,而是重用现有的模块。import importlibimport sysimport sys_shelve_importerfilename = '/tmp/pymotw_import_example.shelve'sys.path_hooks.append(sys_shelv...

2019-07-26 20:53:23 94

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-定制包导入

17.2.6.6 定制包导入可以采用同样的方式加载其他模块和子包。import sysimport sys_shelve_importerdef show_module_details(module): print(' message :',module.message) print(' __name__ :',module.__name__) ...

2019-07-26 20:34:06 107

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-从shelf导入

17.2.6.5 从shelf导入查找工具找到一个模块时,它要负责返回一个能够哦导入该模块的加载工具(loader)。这一节的例子展示了一个定制导入工具,它会将它的模块内容保存到由shelve创建的一个数据库中。首先,使用一个脚本以一个包(其中包含一个子模块和子包)来填充这个shelf。import shelveimport osfilename = '/tmp/pymotw_impo...

2019-07-26 20:05:24 146

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-定制导入工具

17.2.6.4 定制导入工具通过修改搜索路径,程序员可以控制如何找到标准Python模块。不过,如果一个程序需要导入其他地方的代码,而不是从文件系统上常规的.py或.pyc文件导入,那么又该怎么做呢?PEP 302解决了这个问题,通过引入导入hook的思想,它会捕获到在搜索路径上查找一个模块的意图,并采用候选策略从其他位置加载代码或者对它做预处理。可以通过两个不同阶段来实现定制导入工具。查找...

2019-07-26 18:48:39 121

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-导入路径

17.2.6.3 导入路径模块的搜索路径作为一个Python列表保存在sys.path中。这个路径的默认内容包括启动应用所使用脚本的目录和当前工作目录。import sysfor d in sys.path: print(d)搜索路径中的第一个目录是示例脚本本身的主目录。后面是一系列平台特定的路径,指示已编译的扩展模块(用C编写)可能安装在哪些位置。最后列出全局site-pac...

2019-07-26 18:30:16 90

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-内置模块

17.2.6.2 内置模块Python解释器在编译时可以内置一些C模块,因此不需要作为单独的共享库发布这些C模块。这些模块不会出现sys.modules管理的导入模块列表中,因为从理论上将,它们并不是导入的模块。要查找这些可用的内置模块,唯一的方法就是通过sys.builtin_module_names。import sysimport textwrapname_text = ','.j...

2019-07-25 20:16:15 112

转载 第十七章:运行时特性-sys:系统特定配置-模块和导入-导入的模块

17.2.6 模块和导入大多数Python程序最后都会是一个组合,其中包括多个模块以及导入这些模块的一个主应用。无论是使用标准库的特性,还是将定制代码组织到单独的文件中以便于维护,理解和管理程序的依赖关系都是开发的一个重要方面。sys包含了应用可用模块的有关信息,这些模块可能是内置模块,也可能是导入的模块。sys还定义了一些hook,为特殊情况覆盖标准导入行为。17.2.6.1 导入的模块s...

2019-07-25 20:07:07 88

转载 第十七章:运行时特性-sys:系统特定配置-底层线程支持-调试

17.2.5.2 调试找出死锁可能是处理线程最困难的方面之一。sys._current_frames()会有所帮助,它能准确地显示出线程在哪里停止。import sysimport threadingimport timeio_lock = threading.Lock()blocker = threading.Lock()def block(i): t = threa...

2019-07-25 19:49:27 166

转载 第十七章:运行时特性-sys:系统特定配置-底层线程支持-切换间隔

17.2.5 底层线程支持sys包括一些用于控制和调试线程行为的底层函数。17.2.5.1 切换间隔Python3使用一个全局锁来防止单个线程破坏解释器状态。一个时间间隔之后(这个时间间隔是可配置的),字节码执行会暂停,解释器检查是非需要执行某个信号处理器。在这个间隔检查期间,当前线程还会释放全局解释器锁(Global Interpreter Lock,GIL),然后从新请求,使其他线程比释...

2019-07-25 19:30:44 182

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除