zoukankan      html  css  js  c++  java
  • python import

     

    浅析python 的import 模块

     

     

    可通过以下代码逻辑查看sys.path

    from os.path import sys

    print (sys.argv[0])

    模块的搜索路径

    模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的参加(sys.path.apend)即可。下面是sys.path在Windows平台下的添加规矩 。

    1、sys.path第一个路径往往是主模块所在的目录。在交互环境下添加一个空项,它对该当 前目录。

    2、如果PYTHONPATH环境变量存在,sys.path会加载此变量指定的目录。

    3、我们尝试找到Python Home,如果设置了PYTHONHOME环境变量,我们觉得 这就是Python Home,否则,我们应用 python.exe所在目录找到libos.py去推断Python Home。

    如果我们确凿 找到了Python Home,则相干 的子目录(Lib、plat-win、lib-tk等)将以Python Home为根基 参加 到sys.path,并导入(履行 )lib/site.py,将site-specific目录及其下的包参加 。

    如果我们没有找到Python Home,则把注册表SoftwarePythonPythonCore2.5PythonPath的项参加 sys.path(HKLM和 HKCU合并后参加 ),但相干 的子目录不会主动 添加的。

    4、如果我们没有找到Python Home,并且没有PYTHONPATH环境变量,并且不能在注册表中找到PythonPath,那么缺省相对路径将参加 (如:.Lib;. plat-win等)。

    总结如下:

    当在安装好的主目录中运行Python.exe时,首先推断Python Home,如果找到了PythonHome,注册表中的PythonPath将被漠视 ;否则将注册表的PythonPath参加 。

    如果PYTHONPATH环境变量存在,sys.path确定 会加载此变量指定的目录。

    如果Python.exe在另外的一个目录下(不同的目录,比如通过COM嵌入到其他程序),Python Home将不推断,此时注册表的PythonPath将被应用 。

    如果Python.exe不能创造他的主目录(PythonHome),并且注册表也没有PythonPath,则将参加 缺省的相对目录。

    标准 Import

    Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加 载了则只是将模块的名字参加 到正在调用import的模块的Local名字空间中。如果没有加载则从sys.path目录中遵守模块名称查找模块文件,模 块文件可以是py、pyc、pyd,找到后将模块载入内存,并参加 到sys.modules中,并将名称导入到当前的Local名字空间。

    可以看出了,一个模块不会重复 载入 。多个不同的模块都可以用import引入同一个模块到自己的Local名字 空间,其实背后的PyModuleObject对象只有一个。

    说一个容易漠视 的问题,import只能导入模块,不能导入模块中的对象(类、函数、变量等)。 如一个模块 A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,只能用import A。如果想只导入特定的类、函数、变量则用from A import getName即可。

    嵌套Import

    嵌套import,我分两种情况 ,一种是:本模块导入A模块(import A),而A中又有import语句,会激活另一个import动作,如import B,而B模块又可以import其他模块,一直下去。

    对这种嵌套对比 容易了解,注意一点就是各个模块的Local名字空间是独立的,所以上面的例子,本模块import A完了后本模块只能造访 模块A,不能造访 B及其他模块。虽然模块B已经加载到内存了,如果要造访 还要在明确 的在本模块中import B。

    另外一种嵌套指,在模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释 ,抄写 如下:

    [A.py] 
    from B import D 
    class C:pass 

    [B.py] 
    from A import C 
    class D:pass
  • 相关阅读:
    hdu1881(贪心+dp)
    hdu1513(最长公共子序列)
    关于布局的一点心得
    android字符串工具类
    android系统时间格式转换工具类
    android sp文件一个键值保存多条信息
    android 对话框显示工具类
    android网络连接工具类
    日志打印工具类
    关于项目中的一些经验:封装activity、service的基类,封装数据对象
  • 原文地址:https://www.cnblogs.com/danqiu/p/6510046.html
Copyright © 2011-2022 走看看