zoukankan      html  css  js  c++  java
  • python 模块化管理,导入自己的模块(包)

    很多东西似懂非懂,或者当时看懂了,但是感觉不是很重要,经常不用,时间久了,也就变得似懂非懂了。今天被某度电话面试问道一个问题,就是模块倒入,其实我之前也是很仔细的研究过的,不过由于平时做的东西太简单,用不到模块倒入。

    大致对话如下:

    面试官:你了解python中模块么?自定义的模块是什么样子的?

    我:模块就是把经常要用到的函数,类,常量写到一个文件夹下的python文件中,然后去调用

    面试官:那自定义的模块怎么倒入呢

    我:直接 import 包名.模块名

    面试官:你说的是java吧,python也叫包名?难道不是路径名?

    我:对,是路径名,就是路径名中斜杠换成了点。

    面试官:那为什么os,sys这些包不想要导入你说的包名

    我:那些模块已经在python自己的路径里了,所以不需要,具体是什么路径我记不清了

    。。。。

    这个模块导入问题我之前是很清楚的,但是感觉没用,就选择性的忘记了,结果今天被这个问题绊了个跟头

    正文:

    python倒入模块顺序如下:可以用sys.path去查看,返回的是一个列表,就是python的模块查找顺序,也就是说如果你自己的模块路径在sys.path里出现了,那么就可以直接倒入模块名

    1. 程序所在的文件夹
    2. 标准库的安装路径
    3. 操作系统环境变量PYTHONPATH所包含的路径

    因为os,sys等模块在python的安装路径下,所以需要倒入路径,后期用easy_install 或者pip安装的模块也已经安装路径里了,所以也不需要倒入路径。

    从上面的查找模块顺序我们就可以知道有两种方法去导入外部模块,1.通过文件夹方法,此种方法当文件路径较长时,多次倒入时会显得很麻烦,2.通过设置python的环境变量PYTHONPATH,次方法相当于将你的模块变成标准库中的模块,注意,是相当于,就会死说导入模块时也是直接倒入模块名。

    先来看方法1:

    比如,我做的例子:都在/home/xx/python/test

                                                                           ------  __init__.py  (此文件可以为空,它的存在只是为了说明这是一个python模块,当然没有此文件就不能成功倒入此文件夹下的模块到其他的python文件中)

                                                                           -------Human.py

                                                                           -------HumanTest.py

                                                                           -------fibTest.py

                                                                           -------/student/                      (test文件夹下的student文件夹)

                                                                                                   ----------__init__.py

                                                                                                   ----------Student.py

                                                                                                   -----------fib.py

                                                                                                   ------------HumanTest.py

    情况1:需要导入的模块在同一个文件夹中,比如HumanTest.py调用Human模块,就直接  import Human,因为python解释器查找模块时会找同一文件夹,所以不用导入路径名。

    情况2:需要导入的文件在文件夹的子文件夹中,比如fibTest.py调用student文件夹下的fib模块,则 from student.fib imorpt fib,无需加其他路径说明,因为student也是一个模块(模块的集合)

             但是要特别说明一下,我做例子的时候犯了一个错误:Student.py中导入了Human模块,为了少几个文件,我直接在Human.py中又去导入Student模块,结果当然是错误的,因为循环导入了,不过一般不会犯这种错误。

    情况3:需要导入的模块在父文件夹中,比如Stuent.py要导入Human模块,此时要注意,不能直接import test.Human  ,因为解释器找模块只会去本文件夹及本文件夹的子文件夹去找,不会去父文件夹找。。。那怎么办,只能将父文件夹的路径加在sys.path里了

                  所以,在Student导入Human时应该这样,首先import sys ,sys.path.append(“..”),然后再导入Human模块,import Human

                   这种情况可以推广一下,就是所有的导入其实都可以这么做,情况1和情况2也可以这么做,不过也是多次一举,适合导入的模块在其他不相关的我文件下。在前两后写上:import sys,  sys.path.append("path"),  import yourModule   其中path是youModule的文件夹路径。

    再看方法2:

             就是添加python环境变量。export PYTHONPATH=path                            ,此处path也是你的模块的父文件夹,至于怎么export环境变量可以查看linux的 export。这种方法显然会方便很多,推荐使用。

              

    我的例子都是在ubuntu做的,windows中方法1没有问题,方法2设置python环境变量可以查看windows设置环境变量的方法,不再赘述。

  • 相关阅读:
    Java基础-Object通用方法
    Java基础-关键字
    Java基础-运算
    Java基础-String
    Java基础-数据类型
    GCN-GAN:对加权动态网络的非线性时间链路预测模型
    长短期记忆(long short-term memory, LSTM)
    CSP 201604-1 折点计数
    介绍一个好东西C++11
    malloc free使用规范
  • 原文地址:https://www.cnblogs.com/buptldf/p/4972926.html
Copyright © 2011-2022 走看看