精华内容
下载资源
问答
  • 一、导入模块搜索顺序: (1)首先导入内建模块。首先判断这个module是不是built-in即内建模块,如果是内建模块则引入内建模块,如果不是则在一个称为sys.path的list中寻找; (2)在sys.path返回的列表中寻找。...

    前言:本文会以windows和Linux两个平台之下进行说明,python的模块导入的搜索顺序是怎样的。

    一、导入模块的搜索顺序:

    (1)首先导入内建模块。首先判断这个module是不是built-in即内建模块,如果是内建模块则引入内建模块,如果不是则在一个称为sys.path的list中寻找;

    (2)在sys.path返回的列表中寻找。sys.path在python脚本执行时动态生成,它返回的是一个列表,这个列表包含了以下几部分。包括以下5个部分:

    下面的五个搜索路径是有先后顺序的哦!!!

    • 程序的根目录(即当前运行python文件的目录)
    • PYTHONPATH环境变量设置的目录
    • 标准库的目录
    • 任何能够找到的.pth文件的内容
    • 第三方扩展的site-package目录

    因为内建模块是随着解释器一起的,不用自己管,我们只需要查看sys.path这个顺序即可。

    1.1 windows平台之下

    在这个示例中,我是用的是anaconda环境,在环境之下创建了一个pytorch1.2.0的新环境, 执行如下:

    import sys
    sys.path
    '''返回的列表为:
    ['',   # 运行程序的根目录
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\python36.zip', # 这几个是python标准库目录
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\DLLs', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0', 
     'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages'  # 最后面这个是第三方模块所在的目录
    ]
    
    '''
    '''
    # 注意:这里是没有设置PYTHONPATH 环境变量的路径值的,也没有创建.pth文件
    '''

    (1)关于环境变量PYTHONPATH

    PYTHONPATH 这个目录是可配置的),python会搜索PYTHONPATH环境变量里列出的所有目录,因为这个搜索在标准库之前,所以要小心不要覆盖一些标准库的同名模块。 

    (2)什么是*.pth文件

    问题一:什么是 *.pth文件?

    路径配置文件的扩展名是”.pth”,它的作用是在该文件中放置一些列需要让python解释器查找的路径。

    问题二:*.pth文件放在哪里?

    Python 在遍历已知的库文件目录过程中(在遍历sys.path的路径的过程中要能够找得到才行哦!!!),如果见到一个* .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件所指明的库也就可以被 Python 运行环境找到了。所以这个文件不是乱放的,不要能够被解释器找得到的地方才行。

    当然在上面的打印出来的sys.path里面的那些路径里面都可以放置,因为那些路径解释器都能够找得到,但是一般为了方便管理,我们放置在下面两个位置之一:

    import site
    site.getsitepackages()
    '''
    ['D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0',  # python的根目录
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages']  #python的第三方库目录
    '''

    问题三:*.pth文件里面内容怎么写?

    *.pth文件里面放置的其实就是几个目录。其中的每一行包含一个单独的路径,该路径会添加到sys.path列表中,”.pth”中的路径既可以是绝对路径,也可以是相对路径,如果是相对路径,则是相对于包含”.pth”文件的路径而言的。

    比如我自己在 D:\ProgramData\Anaconda3\envs\pytorch1.2.0 

    这个目录之下新建一个文本文档,然后在里面放入一个目录,  F:/pytorch

    然后将文件后缀.txt改为 .pth 

    现在我再次查看sys.path得到如下结果:

    >>> import sys
    >>> sys.path
    '''
    ['', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\python36.zip', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\DLLs', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib', 
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0', 
     'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python36\\site-packages', 
     'F:\\pytorch',             # 这就是新添加进来的路径,而且他在第三方库之前哦
     'D:\\ProgramData\\Anaconda3\\envs\\pytorch1.2.0\\lib\\site-packages'
    ]
    '''

    1.2 Linux平台之下

    同样的操作,先查看sys.path所返回的路径有哪一些

    >>> import sys
    >>> sys.path
    '''
    ['',   # 当前目录
     '/usr/local/python3/lib/python36.zip',  # python标准库目录
     '/usr/local/python3/lib/python3.6', 
     '/usr/local/python3/lib/python3.6/lib-dynload', 
     '/usr/local/python3/lib/python3.6/site-packages' # 第三方库所在的目录
    ]
    '''
    

    另外我们看一下使用site模块的情况:

    import site
    site.getsitepackages()
    '''
    ['/usr/local/python3/lib/python3.6/site-packages']
    '''
    

    我们发现这虽然和window上有一些区别所在,其实原理都是一样的,这里就不再重复试验了。

    1.3 在代码中手动添加搜索路径到sys.path所返回的列表中

    既然前面说过sys.path返回的是一个列表,而且这个列表是动态执行的时候确定的,所以我们可以在编写代码的时候在代码最前面添加某一些需要的搜索路径到sys.path里面如下:

    import sys
    sys.path.append("F:/my_own_path")
    
    

    但是我们一般不太推荐这样做!!!

     

    总结:

    python搜索模块的顺序为如下:

    内建模块 >

    程序的根目录(即当前运行python文件的目录)>

    PYTHONPATH环境变量设置的目录>

    标准库的目录>

    任何能够找到的*.pth文件的内容>

    第三方扩展的site-package目录

    展开全文
  • 模块搜索顺序、重复导入、模块加载列表 0x00 模块搜索顺序: 举例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #test.py ...

    模块搜索顺序、重复导入、模块加载列表

     

    0x00 模块搜索顺序:

    举例:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    #test.py

    import sys

     

    for in sys.path:

    print(p)

     

    运行结果:

    C:\python //pycharm环境中的Add content roots to PYTHONPATH

    C:\python //脚本所在目录

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\python35.zip //打包,java扎包,避免大量小文件占空间

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\DLLs

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages //第三方包安装路径

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32\lib

    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\Pythonwin

      

    模块的路径搜索顺序:
    程序主目录,脚本所在目录
    PYTHONPATH目录,包含python的path路径:标准库目录和第三方包目录

    环境变量:命令行敲的字符串,依次在路径中搜索

    当import 一个模块时,会依次的在以上路径顺序中查找,找到了就不再往后找了,找不到就导入异常,只搜索指定目录,不递归搜索。

    路径可以是字典、zip文件、egg文件(蟒蛇蛋)。
    .egg文件,是由setuptools库创建的包,添加了元数据(版本号、依赖项等)的zip文件。下一篇文章介绍。

    windows优先搜索".",即当前目录
    linux只会从环境变量中的路径中挨个找。

     

    比如,当我们在本地写了一个print.py时,windows下模块搜索顺序优先搜索当前目录,然后才是python的path路径 --> 标准库目录,由于当前目录下自定义了一个print模块,所以可能会导致其它模块print()打印异常


    0x01 模块的重复导入:

    1)创建以下三个文件:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    #test.py

    import test1

    import test2

     

    #test1.py

    print("this is test1 module")

     

    #test2.py

    print("this is test2 module")

     

    运行test.py的结果:

    this is test1 module

    this is test2 module

      

    2)修改下test.py:

    1

    2

    3

    4

    5

    6

    7

    8

    #test.py

    import test1

    import test2

    import test1

     

    再运行下查看结果:

    this is test1 module

    this is test2 module

      上面我们修改test.py后,导入了两次test1模块,但解释器并没有运行两次,也就是模块不会重复的导入。

    3)再修改下test.py和test1.py:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    #test.py

    import test2

    import test1

     

    #test1.py

    print("this is test1 module")

    import test2

     

    输出结果:

    this is test2 module

    this is test1 module

      这次我们先在test.py中先后导入了test2、test1模块,但从输出结果中看,test1.py中导入的test2模块也没有加载初始化,说明程序入口模块已经导入了某模块时,其它调用的模块也不会重复导入该模块。

    4)再修改如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    #test.py

    import test1

    print(test1.test2.x)

     

    #test1.py

    print("this is test1 module")

    import test2

    print(dir())

     

    #test2.py

    print("this is test2 module")

    x=444

     

    运行test.py结果:

    this is test1 module

    this is test2 module

    ['__builtins__''__cached__''__doc__''__file__''__loader__''__name__''__package__''__spec__''test2']

    444

      这次依然可以通过test1.test2.x的方式访问test2模块中的x属性。

    总结:

    内存编址
    共享物理内存

     

    0x02 模块加载列表:

    1

    2

    3

    4

    import sys

    print(sys.modules.keys()) //加载的所有模块名

     

    dict_keys(['_codecs_cn''_imp''stat''encodings.gbk''builtins''winreg''_codecs''__main__''_sitebuiltins''_warnings''encodings.latin_1''sysconfig''genericpath''errno''_multibytecodec''encodings.utf_8''codecs''os''_weakrefset''_bootlocale''sys''os.path''encodings.aliases''_collections_abc''encodings''ntpath''_stat''_frozen_importlib''site''abc''_io''_thread''test2''encodings.mbcs''nt''_frozen_importlib_external''_signal''_weakref''_locale''zipimport''io''marshal''test1'])

      其中部分模块及模块指向的位置:

    1

    2

    3

    4

    5

    6

    7

    8

    '__main__': <module '__main__' from 'C:/python/test.py'>,

    os.path <module 'ntpath' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\ntpath.py'>

    sysconfig <module 'sysconfig' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\sysconfig.py'>

    sys <module 'sys' (built-in)>

    os <module 'os' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\os.py'>

    zipimport <module 'zipimport' (built-in)>

    test2 <module 'test2' from 'C:\\python\\test2.py'>

    ....

      其中部分模块是导入sys模块时,sys模块调用的模块,其中的'__main__'模块指向的是当前脚本名。

     

    展开全文
  • 模块搜索顺序、重复导入、模块加载列表 0x00 模块搜索顺序: 举例: #test.py import sys for p in sys.path: print(p) 运行结果: C:\python //pycharm环境中的Add content roots to PYTHONPATH C...


    模块搜索顺序、重复导入、模块加载列表

     

    0x00 模块搜索顺序:

    举例:

    #test.py
    import sys
    
    for p in sys.path:
    print(p)
    
    运行结果:
    C:\python //pycharm环境中的Add content roots to PYTHONPATH
    C:\python //脚本所在目录
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\python35.zip //打包,java扎包,避免大量小文件占空间
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\DLLs
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages //第三方包安装路径
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32\lib
    C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\Pythonwin
    

      

    模块的路径搜索顺序:
    程序主目录,脚本所在目录
    PYTHONPATH目录,包含python的path路径:标准库目录和第三方包目录

    环境变量:命令行敲的字符串,依次在路径中搜索

    当import 一个模块时,会依次的在以上路径顺序中查找,找到了就不再往后找了,找不到就导入异常,只搜索指定目录,不递归搜索。

    路径可以是字典、zip文件、egg文件(蟒蛇蛋)。
    .egg文件,是由setuptools库创建的包,添加了元数据(版本号、依赖项等)的zip文件。下一篇文章介绍。

    windows优先搜索".",即当前目录
    linux只会从环境变量中的路径中挨个找。

     

    比如,当我们在本地写了一个print.py时,windows下模块搜索顺序优先搜索当前目录,然后才是python的path路径 --> 标准库目录,由于当前目录下自定义了一个print模块,所以可能会导致其它模块print()打印异常


    0x01 模块的重复导入:

    1)创建以下三个文件:

    #test.py
    import test1
    import test2
    
    #test1.py
    print("this is test1 module")
    
    #test2.py
    print("this is test2 module")
    
    运行test.py的结果:
    this is test1 module
    this is test2 module
    

      

    2)修改下test.py:

    #test.py
    import test1
    import test2
    import test1
    
    再运行下查看结果:
    this is test1 module
    this is test2 module
    

      上面我们修改test.py后,导入了两次test1模块,但解释器并没有运行两次,也就是模块不会重复的导入。

    3)再修改下test.py和test1.py:

    #test.py
    import test2
    import test1
    
    #test1.py
    print("this is test1 module")
    import test2
    
    输出结果:
    this is test2 module
    this is test1 module
    

      这次我们先在test.py中先后导入了test2、test1模块,但从输出结果中看,test1.py中导入的test2模块也没有加载初始化,说明程序入口模块已经导入了某模块时,其它调用的模块也不会重复导入该模块。

    4)再修改如下:

    #test.py
    import test1
    print(test1.test2.x)
    
    #test1.py
    print("this is test1 module")
    import test2
    print(dir())
    
    #test2.py
    print("this is test2 module")
    x=444
    
    运行test.py结果:
    this is test1 module
    this is test2 module
    ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test2']
    444
    

      这次依然可以通过test1.test2.x的方式访问test2模块中的x属性。

    总结:

    内存编址
    共享物理内存

     

    0x02 模块加载列表:

    import sys
    print(sys.modules.keys()) //加载的所有模块名
    
    dict_keys(['_codecs_cn', '_imp', 'stat', 'encodings.gbk', 'builtins', 'winreg', '_codecs', '__main__', '_sitebuiltins', '_warnings', 'encodings.latin_1', 'sysconfig', 'genericpath', 'errno', '_multibytecodec', 'encodings.utf_8', 'codecs', 'os', '_weakrefset', '_bootlocale', 'sys', 'os.path', 'encodings.aliases', '_collections_abc', 'encodings', 'ntpath', '_stat', '_frozen_importlib', 'site', 'abc', '_io', '_thread', 'test2', 'encodings.mbcs', 'nt', '_frozen_importlib_external', '_signal', '_weakref', '_locale', 'zipimport', 'io', 'marshal', 'test1'])
    

      其中部分模块及模块指向的位置:

    '__main__': <module '__main__' from 'C:/python/test.py'>,
    os.path <module 'ntpath' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\ntpath.py'>
    sysconfig <module 'sysconfig' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\sysconfig.py'>
    sys <module 'sys' (built-in)>
    os <module 'os' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\os.py'>
    zipimport <module 'zipimport' (built-in)>
    test2 <module 'test2' from 'C:\\python\\test2.py'>
    ....
    

      其中部分模块是导入sys模块时,sys模块调用的模块,其中的'__main__'模块指向的是当前脚本名。

     

    转载于:https://www.cnblogs.com/i-honey/p/8034160.html

    展开全文
  • 当你导入一个模块Python 解析器对模块位置的搜索顺序是: 1、当前目录 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径...

    参考:https://www.runoob.com/python/python-modules.html

    导入模块的格式:

    1. import module,module1 #导入模块
    2. from module import somefunction #从模块中导入函数
    3. from module import function1,function2 #从 模块中导入函数1,函数2
    4. from module import * #从模块导入其中所有的函数
    5. import module as short_name #将要导入的模块从新命名

    当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
    1、当前目录
    2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
    3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
    模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

    PYTHONPATH指的是在配置环境变量的路径

    展开全文
  • Python模块搜索顺序

    2019-06-25 21:58:29
    当你导入一个模块Python解析器对模块位置的搜索顺序是: **1、**当前目录 **2、**如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。 由sys模块的sys.path方法来规定 因为sys.path返回的数据...
  • 在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点。 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个module (2)将module...
  • 模块搜索顺序[扩展] Python的解释器在导入模块时,会: 搜索当目录指定模块名的文件,如果有直接导入 如果没有,在搜索系统目录 在开发时,给文件起名,不要和系统的模块文件重名 Python中每一个模块都有一个...
  • python模块调用顺序

    2020-06-15 22:49:46
    1、python解释器默认搜索路径 ...1)导入一个叫 spam 的模块时,解释器先在当前目录中搜索名为 spam.py 的文件,import语句时导入spam.py,顺序执行其中代码。 目录结构: project/ test.py # 工程主函数所在
  • 搜索顺序应该是: 主目录 -》PYTHONPATH环境变量 -》标准库 -》.pth文件指定的内容 所以如果主目录里有一个自定义的模块文件文件,应该会先加载,然后后面标准库的模块文件可能就不会加载了,也就是隐藏了。还是...
  •  (3)列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序 2、程序执行时添加新的模块路径  sys.path.append('/home/itcast/xxx')  sys.path.insert(0, '/home/itcast/xxx') #...
  • python模块导入

    2018-03-10 18:52:38
     https://blog.csdn.net/kun1280437633/article/details/795104111、路径搜索 列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序,如果程序查找到相同名字的有可能并不是我们所需要的,后面使我们...
  • 目录 模块的四种形式 自定义模块 第三方模块 内置模块 包 import和from...import 循环导入问题 模块搜索路径的顺序 python文件的两种用途 ...
  • 当你导入一个模块Python 解析器搜索模块顺序是: 当前目录 shell 变量(windows环境变量) PYTHONPATH 记录的每个目录。 默认路径: – UNIX:/usr/local/lib/python/ – Windows:C:\Users\username\AppData\...
  • Python解析器对模块位置的搜索顺序

    千次阅读 2018-03-16 00:28:45
    当你导入一个模块Python解析器对模块位置的搜索顺序是: ● 当前目录 ● 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 ● 如果都找不到,Python会察看默认路径。UNIX下,默认...
  • 文章目录import导入模块1. import 搜索路径路径搜索程序执行时添加新的模块路径2....列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序 程序执行时添加新的模块路径 sys.path.append('...
  • 当我们导入某给模块文件时,python解释器去哪里找这个文件,只有找到这个文件才能读取、装载运行该模块文件,一般按照如下路径寻找模块文件(按照顺序寻找,找到即停不继续往下找) 内置模块 当前目录 程序的主...
  • python--import导入模块

    2018-07-24 21:19:40
    import 导入模块 import搜索路径 import sys print(sys.path) 路径搜索 从sys.path所列的目录里依次查找需要导入的模块文件 ”表示当前路径 列表中的路径的先后顺序代表了python解释器在搜索模块时的先后...
  • python 模块搜索路径

    2018-09-04 23:36:21
    当你导入一个模块Python 解析器对模块位置的搜索顺序是: 1、当前目录 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 3、如果都找不到,Python会查看默认路径。UNIX下,默认路径...
  • Python的引包机制 / 模块搜索顺序 1、当前目录下有没有该***.py 2、python安装目录下面去找“**\Python36\Lib”下有没有*.py 3、环境变量path下面去找 导入python工程下新建文件夹Case自定义testcase的模块: ...
  • 最初接触python时通过...当你导入一个模块Python解析器对模块位置的搜索顺序是: 当前目录 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 如果都找不到,...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

python导入模块搜索顺序

python 订阅