admin 管理员组文章数量: 1086019
2024年3月26日发(作者:delphi怎么生成exe)
python模块导入(import)问题彻底解决
众所周知,python既可以导入包(import package),也可以导入模块(import
module),package一般理解为多文件的模块,它是这样定义的,如果一个目录下存在”
__init__.py”这个文件,那么python就认为这个目录下的所有文件同属于一个package
(这和java的namespace有点像,但是java可不需要这么个特殊文件),如果没有这个
文件,那么python认为目录下的py文件都是不相干的独立模块。但是在子目录中你可不
能这么干,如果子目录中没有”__init__.py”,那么该目录下的程序算是白写了,根本没有
办法引用。当然,也不是绝对的,除非绕个大弯儿:设置当前目录,然后导入,然后重设
当前目录。比如,程序需要使用test目录中的模块,而test目录不是package,你只能
这样做: 1: ("test") 2: import testfuncs 3: ("..") 最方便
的引入,当然是同一个目录的模块(除了及其简单的程序,很少有人会使用这种扁平的目
录结构),那是想怎么导入就怎么导入。比如在主程序中想要使用另一个文件模块中的函数,
只需要直接导入即可: 1: import testfuncs #直接导入模块(也就是不带扩展名的文
件名) 2: 3: unc() #通过模块的名字引用其中的函数 4: from
testfuncs import nousefunc #导入模块中的函数 5: nousefunc() #直接调用导入的
函数 上面只是最简单的情况,如果文件中定义的是class怎么样呢,实际使用也是
差不多的,不过要多一次构造class的实例的调用: 1: import testclass #直接导入模
块(也就是不带扩展名的文件名) 2: obj=ass(); #实例化类 3:
1() #通过模块的名字引用其中的class,然后才到类的函数,注意类要实例化 4:
from testclass import TestClass #导入模块中的类 5: obj=TestClass(); #实例化类
6: 1() #调用函数如果都是这种从程序中引入同目录或者子目录的包,那么事情就
简单了,但是如果是同为子目录中的模块,要引入兄弟目录中的模块或类,要怎么办呢?
例如,如下的目录结构:图中src目录就是程序的顶层目录,也是包导入的顶层package,
pub目录及其子目录是公用程序所在。在这种情况下,最好的方法就是在主程序中(一般
位于应用的源程序的根目录,如图中的),把所有下级的目录都缴入的中,
然后在子目录中的模块中,只要使用完全限定的包名引入其他子目录中的模块或者类就可
以了。然而现实的情况往往不那么尽如人意,比如为公用包写的测试程序需要放在
pub/test目录下,测试目标在pub/data目录下,这是不能寄希望与应用的主程序了,因
为此时不会去运行应用程序。这种情况下,启动程序和被引用的包同在一个父目录的子目
录中。此时该怎么办呢,还是老办法,要把父目录(src/pub)和(src/pub/data、src/pub/test)
目录都要加入中,然后再用绝对的方式进行引入(import il /
from il import DataUtil)。每一个需要的模块都要这么干,因此,我特
地写了一个函数,来自动的处理这种情况:import os,sysimport TestClassimport
testfuncs;from TestClass import TestClass;def _prepareRelativeImport(layer=2):
""" 为相对引用做准备,以便下层目录中的模块,相对引用[本目录]以及[父目录]和[兄弟目
录]中的模块。 参数layer,表示引入到多少层父目录。默认为2->引入本目录和父目
录;3->引入本目录、父目录和祖父目录。 """ import sys,os;
curP=h(e(__file__));
oriP=curP;__package__=tion()[2]; print('/r/ncurdir=',curP);
while layer>=0: layer-=1; if not curP in
:(curP);
pa=tion();curN=pa[2];pp=pa[0];(pp); #if
'__init__' in ''.join(r(curP)):__import__(curN); curP=pp;
(oriP);if __name__=='__main__': if not '__file__' in
dir():__file__=h('.')++"";
_prepareRelativeImport(2) from TestClass import TestClass; from
ass import TestClass; from eOperator import
CompareOperators print('/r/nTest of RelativeImport done!')
This work is licensed under a Creative Commons Attribution Non-commercial
license.
版权声明:本文标题:python模块导入(import)问题彻底解决 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711466916a595656.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论