python模块导入(import)问题彻底解决.docxVIP

  • 30
  • 0
  • 约2.97千字
  • 约 4页
  • 2021-04-12 发布于天津
  • 举报
导入的函数 上面只是最简单的情况,如果文件中定义 导入的函数 上面只是最简单的情况,如果文件中定义 python 模块导入 (import) 问题彻底解决 众所周知,Python既可以导入包(import Package),也 可以导入模块( import module ), package 一般理解为多文件 的模块,它是这样定义的, 如果一个目录下存在” __init__.py” 这个文件, 那么 python 就认为这个目录下的所有文件同属于 个 p ackage (这和 java 的 names pace有点像,但是 java 可 不需要这么个特殊文件) ,如果没有这个文件,那么 python 认为目录下的 py 文件都是不相干的独立模块。但是在子目 录中你可不能这么干,如果子目录中没有”init 录中你可不能这么干,如果子目录中没有” init__.py ”,那 么该目录下的程序算是白写了,根本没有办法引用。当然, 也不是绝对的, 除非绕个大弯儿:设置当前目录, 然后导入,然后重设当前目录。 比如,程序需要使用test 目录中的模块,而 也不是绝对的, 除非绕个大弯儿: 设置当前目录, 然后导入, 然后重设当前目录。 比如,程序需要使用 test 目录中的模块, 而test目录不是package,你只能这样做: 1: os.chdir(test) 最方便的引入, 当2: import testfuncs 3: os.chdir(..) 最方便的引入, 当 然是同一个目录的模块(除了及其简单的程序,很少有人会 使用这种扁平的目录结构) ,那是想怎么导入就怎么导入。 直接导入即可:比如在主程序中想要使用另一个文件模块中的函数,只需要 直接导入即可: 1: import testfuncs #直接导入模块(也 就是不带扩展名的文件名)2:3: testfuncs.nousefunc()#通过模块的名字引用其中的函数4: from testfuncs import 就是不带扩展名的文件名) 2: 3: testfuncs.nousefunc() #通过模块的名字引用其中的函数 4: from testfuncs import nousefunc #导入模块中的函数 5: nousefunc() #直接调用 的是class怎么样呢,实际使用也是差不多的, 不过要多一次 构造class的实例的调用: 1: import testclass #直接导入 模块(也就是不带扩展名的文件名)2: 模块(也就是不带扩展名的文件名) 2: obj=testclass.TestClass(); #实例化类 3: obj.func1() # 通过模 块的名字引用其中的 class然后才到类的函数,注意类要实例 化 4: from testclass import TestClass #导入模块中的类 6: obj.func1() # 调用函数如5: obj=TestClass(); #实例化类 果都是这种从程序中引入同目录或者子目录的包,那么事情 就简单了,但是如果是同为子目录中的模块,要引入兄弟目 录中的模块或类,要怎么办呢?例如,如下的目录结构:图 中src目录就是程序的顶层目录, 也是包导入的顶层Package 6: obj.func1() # 调用函数如 的方法就是在主程序中(一般位于应用的源程序的根目录 如图中的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 中,然后再用绝对的方式 为相对 为相对 TestClass;def _prepareRelativeImport(layer=2): 引用做准备,以便下层目录中的模块,相对引用 [本目录]以 及[ 及[ 父目录 ]和[ 兄弟目录 ]中的模块。 参数layer,表示引入 到多少层父目录。默认为2-gt;引入本目

文档评论(0)

1亿VIP精品文档

相关文档