



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、python 模块导入 (import) 问题彻底解决众所周知, python 既可以导入包( import package ),也 可以导入模块( import module ),package 一般理解为多文件 的模块,它是这样定义的, 如果一个目录下存在” _init_.py ” 这个文件, 那么 python 就认为这个目录下的所有文件同属于 一个 package (这和 java 的 namespace有点像,但是 java 可 不需要这么个特殊文件) ,如果没有这个文件,那么 python 认为目录下的 py 文件都是不相干的独立模块。但是在子目 录中你可不能这么干,如果子目录中没
2、有”_init_.py ”,那么该目录下的程序算是白写了,根本没有办法引用。当然, 也不是绝对的, 除非绕个大弯儿: 设置当前目录, 然后导入, 然后重设当前目录。 比如,程序需要使用 test 目录中的模块, 而test目录不是package,你只能这样做:1: os.chdir(test)2: import testfuncs3: os.chdir(.)最方便的引入, 当然是同一个目录的模块(除了及其简单的程序,很少有人会 使用这种扁平的目录结构) ,那是想怎么导入就怎么导入。 比如在主程序中想要使用另一个文件模块中的函数,只需要 直接导入即可: 1: import testfuncs #
3、直接导入模块(也 就是不带扩展名的文件名) 2:3: testfuncs.nousefunc()#通过模块的名字引用其中的函数4: from testfuncs importnousefunc #导入模块中的函数5: nousefunc() #直接调用导入的函数 上面只是最简单的情况,如果文件中定义 的是class怎么样呢,实际使用也是差不多的,不过要多一次构造class的实例的调用:1: import testclass #直接导入模块(也就是不带扩展名的文件名)2:obj=testclass.TestClass(); #实例化类3: obj.func1() # 通过模块的名字引用其中的cl
4、ass然后才到类的函数,注意类要实例 化 4: from testclass import TestClass #导入模块中的类 5: obj=TestClass(); #实例化类 6: obj.func1() #调用函数如 果都是这种从程序中引入同目录或者子目录的包,那么事情 就简单了,但是如果是同为子目录中的模块,要引入兄弟目 录中的模块或类,要怎么办呢?例如,如下的目录结构:图 中src目录就是程序的顶层目录,也是包导入的顶层package,pub目录及其子目录是公用程序所在。在这种情况下,最好 的方法就是在主程序中(一般位于应用的源程序的根目录 , 如图中的start.py),把所有下
5、级的目录都缴入的sys.path中,然后在子目录中的模块中,只要使用完全限定的包名引入其 他子目录中的模块或者类就可以了。然而现实的情况往往不 那么尽如人意, 比如为公用包写的测试程序需要放在 pub/test 目录下,测试目标在 pub/data 目录下,这是不能寄希望与应 用的主程序了, 因为此时不会去运行应用程序。 这种情况下, 启动程序和被引用的包同在一个父目录的子目录中。此时该怎么办呢,还是老办法,要把父目录(src/pub )和(src/pub/data、src/pub/test)目录都要加入 sys.path中,然后再用绝对的方式 进行引入 (import pub.data.da
6、tautil / from pub.data.datautil import DataUtil) 。每一个需要的模块都要这么干,因此,我 特地写了一个函数,来自动的处理这种情况 :import os,sysimport TestClassimport testfuncs;from TestClass import TestClass;def _prepareRelativeImport(layer=2): 为相对引用做准备,以便下层目录中的模块,相对引用本目录以及父目录和兄弟目录中的模块。参数layer,表示引入到多少层父目录。 默认为 2-> 引入本目录和父目录; 3-> 引入本
7、目录、父目录和祖父目录。 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=pa2;pp=pa0;os.chdir(p p);#if _init_ in.join(os.listdir(curP):_import_(curN);curP=pp;os.chdir(oriP);if _name_=_main_:if not _file_ indir():_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 CompareOperat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论