众所周知,python既可以导入包(import package),也可以导入模块(import module),package一般理解为多文件的模块,它是这样定义的,如果一个目录下存在”__init__.py”这个文件,那么python就认为这个目录下的所有文件同属于一个package(这和java的namespace有点像,但是java可不需要这么个特殊文件),如果没有这个文件,那么python认为目录下的py文件都是不相干的独立模块。但是在子目录中你可不能这么干,如果子目录中没有”__init__.py”,那么该目录下的程序算是白写了,根本没有办法引用。当然,也不是绝对的,除非绕个大弯儿:设置当前目录,然后导入,然后重设当前目录。比如,程序需要使用test目录中的模块,而test目录不是package,你只能这样做:

   1: os.chdir("test")
   2: import testfuncs
   3: os.chdir("..")

最方便的引入,当然是同一个目录的模块(除了及其简单的程序,很少有人会使用这种扁平的目录结构),那是想怎么导入就怎么导入。比如在主程序中想要使用另一个文件模块中的函数,只需要直接导入即可:

   1: import testfuncs  #直接导入模块(也就是不带扩展名的文件名)
   2: 

3: testfuncs.nousefunc() #通过模块的名字引用其中的函数

4: from testfuncs import nousefunc #导入模块中的函数

5: nousefunc() #直接调用导入的函数

上面只是最简单的情况,如果文件中定义的是class怎么样呢,实际使用也是差不多的,不过要多一次构造class的实例的调用:

   1: import testclass  #直接导入模块(也就是不带扩展名的文件名)
   2: obj=testclass.TestClass(); #实例化类

3: obj.func1() #通过模块的名字引用其中的class,然后才到类的函数,注意类要实例化

4: from testclass import TestClass #导入模块中的类

5: obj=TestClass(); #实例化类

6: obj.func1() #调用函数

如果都是这种从程序中引入同目录或者子目录的包,那么事情就简单了,但是如果是同为子目录中的模块,要引入兄弟目录中的模块或类,要怎么办呢?例如,如下的目录结构:

图中src目录就是程序的顶层目录,也是包导入的顶层package,pub目录及其子目录是公用程序所在。在这种情况下,最好的方法就是在主程序中(一般位于应用的源程序的根目录,如图中的start.py),把所有下级的目录都缴入的sys.path中,然后在子目录中的模块中,只要使用完全限定的包名引入其他子目录中的模块或者类就可以了。然而现实的情况往往不那么尽如人意,比如为公用包写的测试程序需要放在pub/test目录下,测试目标在pub/data目录下,这是不能寄希望与应用的主程序了,因为此时不会去运行应用程序。这种情况下,启动程序和被引用的包同在一个父目录的子目录中。此时该怎么办呢,还是老办法,要把父目录(src/pub)和(src/pub/data、src/pub/test)目录都要加入sys.path中,然后再用

绝对的方式进行引入(import pub.data.datautil / from pub.data.datautil import DataUtil)。每一个需要的模块都要这么干,因此,我特地写了一个函数,来自动的处理这种情况:

import os,sys
import TestClass
import testfuncs;
from TestClass import TestClass;def _prepareRelativeImport(layer=2):""" 为相对引用做准备,以便下层目录中的模块,相对引用[本目录]以及[父目录]和[兄弟目录]中的模块。参数layer,表示引入到多少层父目录。默认为2->引入本目录和父目录;3->引入本目录、父目录和祖父目录。"""import sys,os;curP=os.path.abspath(os.path.dirname(__file__)); oriP=curP;__package__=curP.rpartition(os.path.sep)[2];print('\r\ncurdir=',curP);while layer>=0:layer-=1;if not curP in sys.path:sys.path.append(curP);pa=curP.rpartition(os.path.sep);curN=pa[2];pp=pa[0];os.chdir(pp);#if '__init__' in ''.join(os.listdir(curP)):__import__(curN);curP=pp;os.chdir(oriP);if __name__=='__main__':if not '__file__' in dir():__file__=os.path.abspath('.')+os.path.sep+"1.py";_prepareRelativeImport(2)from TestClass import TestClass;from pub.test.TestClass import TestClass;from pub.data.CompareOperator import CompareOperatorsprint('\r\nTest of RelativeImport done!')

总结,这么做之后解决了对于测试单个功能或模块的导入问题,但是在从应用的顶层目录中运行程序时,还是只能使用Python 3的"from ."来做相对导入,这还真是纠结。

This work is licensed under a Creative Commons Attribution Non-commercial license.

转载于:https://www.cnblogs.com/dajianshi/archive/2012/12/28/2837270.html

python 3模块导入(import)问题一则相关推荐

  1. Python fitz模块导入出错的解决

    Python fitz模块导入出错的解决 我们不应该仅仅使用pip install fitz来安装fitz,而是同时安装fitz和PyMuPDF(一定注意安装顺序:先安装fitz,然后安装pymupd ...

  2. python中模块导入问题(已解决)

    python中模块导入问题(已解决) 参考文章: (1)python中模块导入问题(已解决) (2)https://www.cnblogs.com/Christen/p/6395470.html 备忘 ...

  3. python 引入同一路径的类_Python入门 模块导入 import ...\from... import...

    代码越来越多的时候,我们将代码写到一个.py 文件里,随着代码的增加,代码的维护越来越困难.如果将代码按照不同的功能拆分放到不同的.py文件中,每个.py文件就是一个模块. 不同模块中的变量名可以相同 ...

  4. python怎么导入时间-Python,模块导入方式和time模块的使用

    一.模块的导入 1. 模块导入会将要导入的文件执行一遍 2. 导入模块的名称就是我们定义的脚本或包的名称 3. 我们导入模块的过程总结就是:在指定的范围内搜索指定名称对 python 脚本或者包,将其 ...

  5. python random模块导入_Python学习笔记(二十)—模块的导入

    一.模块介绍 Python 提供了强大的模块支持,主要体现在Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块.通过这些强大的模块可以极大地提 ...

  6. python之模块导入和包

    一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...

  7. python shutil模块导入_python常用模块之shutil模块

    python常用模块之shutil模块 shutil模块,高级的文件.文件夹.压缩包处理模块 1.shutil.copyfile(src,des[,length]):将文件内容拷贝到另一个文件 In ...

  8. python自定义模块导入失败_python导入自定义模块失败怎么解决

    py执行文件和模块同属于同个目录(父级目录),才能直接import模块: 如果不在同一目录,可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python ...

  9. python settings模块导入不了_python settings 中通过字符串导入模块

    1. 项目文件结构 set_test ├─ main.py # 入口函数 │ ├─notify # 自定义的模块 │ ├─ email.py # 自定义模块 │ ├─ msg.py # 自定义模块 │ ...

  10. python的模块导入问题_python的模块导入问题

    以下内容参考:http://www.xinxingjiaocheng.com/online/item/7/89 1.给模块起个别名 如果一个模块的名字很长很长,就像这样comput_the_value ...

最新文章

  1. 2022-2028年中国节能建材行业深度调研及投资前景预测报告
  2. Apache访问日志详解
  3. OSSIM系统用户审计
  4. redhat7.4启动telnet和SSH服务,修改IP地址
  5. h5的fetch方法_你不需要jQuery(三):新AJAX方法fetch()
  6. 邮箱不可用 550 User has no permission
  7. sql语法中u‘‘ n‘‘详解
  8. 在Eclipse上安装pydev开发工具
  9. java自己写一个消息队列_Java语言快速实现简单MQ消息队列服务
  10. ubuntu安装英伟达显卡GT 540M驱动
  11. OpenMV学习(0):环境搭配
  12. 假如从餐饮店的角度来看架构…
  13. python替换 输入手机号_python file模块 替换输入内容脚本
  14. 认识Excel的第三天(字数满格自动换行、插入一行/列单元格、修改边框样式)
  15. MATLAB中的impixel函数——获取图像像素值
  16. Day3 4月29日
  17. LQ-630K/LQ-635K如何安装及更换打印机色带?
  18. 目录-降膜式蒸发器及其应用
  19. 小心,中兴无线上网卡会让 Mac 无法启动(附解决办法)
  20. 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合

热门文章

  1. yum install mysql-server 指定版本_mysql 指定版本安装
  2. 老显卡都涨价了,所以我把坏的显卡拿出来修
  3. LINUX/MAC的rpath,搜索依赖库时从哪里开始
  4. CSDN博文分类全部删除了?
  5. GIT在WINDOWS/LINUX下载的源码,回车换行有差异
  6. 又漏了一张发票,所以报销要及时
  7. 脚本中调用别的脚本,如何得到执行结果?
  8. 安卓图片自适应的解决办法
  9. 天线工程手册_胆大心细 专业敬业——记FPSO改装MV30项目球形天线组装工程
  10. 不挂载 组件渲染_12、全局组件和局部组件