• Python核心编程读笔 13:执行环境


    第14章  执行环境

    一、可调用对象

    python有四种可调用对象:函数、方法、类、一些类的实例

    1 函数

    (1)内建函数(BIF)

    BIF是用c/c++写的,编译后放入python解释器,然后把它们作为第一(内建)名字空间的一部分加载进系统。这些函数在_bulitin_模块里,并作为__builtins__模块导入到解释器中

    内建函数属性:

      bif.__doc__   文档字符串(或 None)
      bif.__name__   字符串类型的文档名字
      bif.__self__    设置为 None(保留给 built-in 方法)
      bif.__module__   存放 bif 定义的模块名字(或 None)

    (2)用户定义的函数(UDF)

    用户自定义函数属性:

      udf.__doc__     文档字符串(也可以用 udf.func_doc)
      udf.__name__      字符串类型的函数名字(也可以用 udf.func_name)
      udf.func_code    字节编译的代码对象
      udf.func_defaults    默认的参数元组
      udf.func_globals    全局名字空间字典; 和从函数内部调用 globals(x)一样
      udf.func_dict    函数属性的名字空间
      udf.func_doc   (见上面的 udf.__doc__)
      udf.func_name    (见上面的 udf.__name__)
      udf.func_closure    包含了自由变量的引用的单元对象元组

    2 方法

    内建方法(BIM)属性:

      bim.__doc__ 文档字串
      bim.__name__ 字符串类型的函数名字
      bim.__self__ 绑定的对象

    用户自定义(UDM)属性:

      udm.__doc__   文档字符串(与 udm.im_fuc.__doc__相同)
      udm.__name__    字符串类型的方法名字(与 umd.im_func.__name__相同)
      udm.__module__    定义 udm 的模块的名字(或 none)
      udm.im_class    方法相关联的类(对于绑定的方法;如果是非绑定,那么为要求 udm 的类)

      udm.im_func   方法的函数对象(见 UDFs)
      udm.im_self   如果绑定的话为相关联的实例,如果非绑定位为none

    3 类

    4 类的实例

    python 给类提供了名为__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()方法是没有实现的,这意味着大多数实例都是不可调用的。然而,如果在类定义中覆盖了这个方法,那么这个类的实例就成为可调用的了。调用这样的实例对象等同于调用__call__()方法。

    实例:

      >>> class C(object):
      ... def __call__(self, *args):
      ...    print "I'm callable! Called with args: ", args
      ...

      >>> c = C()

      >>> c() # instance invoked # 调用实例
      I'm callable! Called with arguments:
      ()
      >>> c(3) # invoked with 1 arg # 呼叫的时候给出一个参数
      I'm callable! Called with arguments:
      (3,)
      >>> c(3, 'no more, no less') # invoked with 2 args # 呼叫的时候给出两个参数
      I'm callable! Called with arguments:
      (3, 'no more, no less')

    二、代码对象 

    一般说来,代码对象可以作为函数或者方法调用的一部分来执行,也可用 exec 语句或内建函数eval()来执行。从整体上看,一个 python 模块的代码对象是构成该模块的全部代码。

    UDF的udf.func_code属性其实就是代码对象

    函数对象仅是代码对象的包装,方法则是给函数对象的包装。你可以到处看看。当研究到最底层,你会发现便是一个代码对象

    三、可执行的对象声明和内建函数

    callable(obj)          如果 obj 可调用,返回 True,否则返回 FALSE
    compile(string,file, type)   从type类型中创建代码对象;file 是代码存放的地方(通常设为"") 
    eval(obj, globals=globals(), locals=locals())    对obj进行求值,obj是已编译为代码对象的表达式,或是一个字符串表达式;可以给出全局或者/和局部的名字空间
    exec obj        执行obj、单一的python语句或者语句的集合,也就是说格式是代码对象或者字符串;obj 也可以是一个文件对象(已经打开的有效 python 脚本中)
    input(prompt='')    等同于 eval( raw_input(prompt=”) )

    四、执行其他程序

    1 执行其他python程序

    (1)通过import的方式

      # import1.py
      print 'loaded import1'
      import import2

      # import2.py

      print 'loaded import2'

      当导入 import1 时的输出:
      >>> import import1

      loaded import1

      loaded import2

    (2)execfile()

      f = open(filename, 'r')
      exec f

      f.close()

    等价于:

      execfile(filename)

    (3)将模块作为脚本执行

      即从 shell 或 DOS 提示符,直接把模块作为脚本来执行

    2 执行其他非python程序

    支持执行其他非python程序的函数都位于os模块中:

    system(cmd)   执行程序 cmd(字符串),等待程序结束,返回退出代码(windows 下, 始终为 0)

    fork()     创建一个和父进程并行的子进程[通常来说和 exec*()一起使用]; 返回两 次....一次给父进程一次给子进程

    execl(file, arg0,arg1,...)   用参数列表 arg0, arg1 等等执行文件

    execv(file, arglist)   除了使用参数向量列表,其他的和 execl()相同

    execle(file, arg0,arg1,... env)   和 execl 相同,但提供了环境变量字典 env

    execve(file,arglist, env)   除了带有参数向量列表,其他的和execle()相同

    execlp(cmd, arg0,arg1,...)   与execl()相同,但是在用户的搜索路径下搜索完全的文件路径名

    execvp(cmd, arglist)     除了带有参数向量列表,与execlp()相同

    execlpe(cmd, arg0, arg1,... env)   和 execlp 相同,但提供了环境变量字典env 

    execvpe(cmd,arglist, env)   和 execvp 相同,但提供了环境变量字典 env

    spawn*(mode, file, args[, env])   spawn*()家族在一个新的进程中执行路径,args 作为 参数,也许还有环境变量的字典 env;模式(mode)是个显示不同操作模式的魔术。

    wait()   等待子进程完成[通常和 fock 和 exec*()一起使用] ○ Unix专有

    waitpid(pid,options)   等待指定的子进程完成[通常和 fock 和 exec*()一起使用] ○ Unix专有

    popen(cmd, mode='r',buffering=-1)   执行字符串 cmd,返回一个类文件对象作为运行程序通信句柄,默认为读取模式和默认系统缓冲

    startfile(path)   用关联的应用程序执行路径 Windows专有

    (1)os.system()

    >>>import os

    >>>result = os.system( 'cat /etc/motd' )   Linux命令

    >>>import os

    >>>result = os.system( 'dir' )  windows命令

    (2)os.popen()

    popen()函数 = 文件对象 + system()函数

    >>> import os
    >>> f = os.popen('uname -a')
    >>> data = f.readline()
    >>> f.close()
    >>> print data,
    Linux solo 2.2.13

    六、结束执行

    1 sys.exit()和SystemExit异常

    当调用sys.exit()时,会引发systemExit异常。 SystemExit是唯一不看作错误的异常。 它仅仅表示要退出 python 的愿望。

    2 sys.exitfunc()

    sys.exitfunc()默认是不可用的,但你可以改写它以提供额外的功能。当调用了 sys.exit()并 在解释器退出之前,就会用到这个函数了。

    3 os._exit( status ) 

    功能与 sys.exit()和 sys.exitfunc()相反,根本不执行任何清理便立即退出 python。与 sys.exit()不同,状态参数是必需的。通过 sys.exit()退出是退出解释器的首选方法

    4 os.kill( pid, sig )

    os 模块的 kill()函数模拟传统的 unix 函数来发送信号给进程。kill()参数是进程标识数(PID) 和你想要发送到进程的信号。发送的典型信号为SIGINT, SIGQUIT,或更彻底地,SIGKILL来使进程终结。

    七、各种操作系统接口

  • 相关阅读:
    对dedecms、php168,phpcms、VeryCMS、DiyPage五款开源整站系统的简单评点(
    [转+总结]Linux虚拟系统安装VMware Tools总结
    VMware虚拟机的联网(图)
    自己动手架设linux下Web服务器(图)4
    免费三个月的美国vps:JUMPLINE,速度不错
    中文 CentOS 攻略
    linux不能上网如何配置
    格式化字符串
    gitlab在push代码的时候报错
    运行ntpdate报错:Temporary failure in name resolution
  • 原文地址:https://www.cnblogs.com/hansonwang99/p/4967558.html
Copyright © 2020-2023  润新知