zoukankan      html  css  js  c++  java
  • python之模块的导入

    今天在做一个项目的时候卡在模块导入这个点上了。赶紧回头总结一下

    一.被导入的文件和工作的脚本在一个目录下

    1.导入一个.py文件里的功能或参数(导入模块)

     先看一下目录结构:

    module里有两个功能,一个参数,我们要把module里的内容导入到test里(图里的model拼写错误,请忽略~~)

    data = 'in the test'
    def fun1():
        print('in the test fun1')
    def fun2():
        print('in the test fun2')
    module1

    有下面这几种方法:

    方法1:

    import module1
    module1.fun1()
    module1.fun2()
    print(module1.data)

    这种方法直接导入了module.py这个文件,然后直接调用里面的参数。相当于在test.py里加了个名字为module1的变量,把原有module1里的内容赋值给这个变量。然后再调用

    如果只需导入fun1,可以用方法2

    from module1 import fun1
    fun1()

    这种只导入了fun1一个功能,但调用的时候不用加上前面的模块名作为前缀,用from...import的语法也可以导入模块下所有的功能

    from module1 import *
    fun1()    #不用加模块名,直接调用
    fun2()

    这个方法相当于把module里的内容直接复制了一遍在test.py内。但是一般情况下是不要用这个语句,因为可能会造成变量的污染:如果原先有个变量或函数名字和导入模块的名字一样,就会被最后出现的覆盖掉

    def fun1():
        print('in test fun1')
    from module1 import *
    fun1()

    由于module1内有个函数名为fun1,运行以后,打印出的就成,了

    in the test fun1

    所以常规情况下一定不要用这个方法。单是如果被导入的模块确实和脚本里的变量名称出现冲突,但是两者又都不能更改,可以用这个方法

    def fun1():
        print('in test fun1')
    from module1 import fun1 as fun
    fun()
    fun1()

     运行一下,工作正常

    in the test fun1
    in test fun1

    2.导入包

    如果想导入一个包,其实就是导入了包所在目录下的__init__.py这个文件,

    我们重新定义下目录结构

    fun1和fun2里都定义了个fun

    def fun():
        print('in fun1 fun')
    fun1
    def fun():
        print('in fun2 fun')
    fun2

    修改一下__init__.py这个文件,加一句

    print('in the module_test2 __init__.py')

    然后直接把包导入到test.py中,运行一下,看看发现了什么?

    import module_test2
    in the module_test2 __init__.py

    可以发现,导入包其实就是执行该包下的__init__.py文件。如果想导入包下的所有文件该怎么操作呢?

    from module_test2 import fun1,fun2
    fun1.fun()
    fun2.fun()

    这样就可以导入指定的文件了,其实还有一种方法,我们刚才发现了,导入包的时候就是执行了__init__.py文件,其实也可以把这个文件修改一下,

    from . import fun1,fun2   #   一定要加from.

    这个from . 一定要加否则默认的路径会错误,在test里导入的时候就成了(相对导入)

    import module_test2
    module_test2.fun1.fun()
    module_test2.fun2.fun()

    各有各的好处吧。

    ps:我其实就是卡在这里了:是想找一个直接全部导入包的方法,不用把每个文件都输一遍,暂时无解。

    二.导入非本目录下的模块

    在导入模块的时候,一定要把模块的路径加载sys.path列表里,用sys.path.append将路径加载到环境变量里,如果模块是在工作目录的父目录里,就先获取该模块的地址

    import sys,os
    dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    然后再把它加载到环境变量里

    sys.path.append(dir_path)

    如果是父目录下的某个子文件夹下的文件夹里,就要把该文件夹的绝对路径加载到sys.path里。

    三.导入的优化

    1.模块在导入的时候只要模块相同,不管导入了几次只执行一次,所以在导入的时候如果用了这种方式

    import test
    test.fun1()
    test.fun2()

    在执行这样的代码时,先加载了test,然后每次调用都是先遍历test,效率相对来说会比较低,可以用from。。。import的方式,直接导入

    from test import fun1,fun2
    fun1()
    fun2()

    在调用的时候效率能相对高一点点!

    2.由于导入的时候是从前往后遍历sys.path这个列表的,其实为了增加效率,其实不应该用append,而应该用insert,插入列表的第一位,就会增加遍历的速度。

    sys.path.append(dir_path)

    然后直接用导入包的方法导入就可以了

  • 相关阅读:
    mac下 brew 切换阿里镜像
    梨视频(PearVideo)下载解析的方法和技巧,梨视频下载到本地
    如何快速的下载Tumblr(汤不热)视频?操作步骤很简单,快来看看!
    什么是json? 什么是xml?JSON与XML的区别比较
    如何下载Twitter视频?最简单的保存推特视频的方法
    【收藏】轻松导出全民K歌里任何人录制的短视频(MV)、歌曲的方法
    【小白技术笔记】保存皮皮虾APP无水印视频到手机相册,只需要三步 [技术干货]
    技术干货!腾讯微视短视频去水印下载到本地的方法
    P1562 还是N皇后
    循环赛日程表
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/10480214.html
Copyright © 2011-2022 走看看