邻水建设局网站,软件开发工程师的岗位职责,WordPress底部设计,怎样做网站表白python中的Module是比较重要的概念。常见的情况是#xff0c;事先写好一个.py文 件#xff0c;在另一个文件中需要import时#xff0c;将事先写好的.py文件拷贝 到当前目录#xff0c;或者是在中增加事先写好的.py文件所在的目录#xff0c;然后import。这样的做法#x…python中的Module是比较重要的概念。常见的情况是事先写好一个.py文 件在另一个文件中需要import时将事先写好的.py文件拷贝 到当前目录或者是在中增加事先写好的.py文件所在的目录然后import。这样的做法对于少数文件是可行的但如果程序数目很 多层级很复杂就很吃力了。有没有办法像Java的Package一样将多个.py文件组织起来以便在外部统一调用和在内部互相调用呢答案是有的。主要是用到python的包的概念python__init__.py在包里起一个比较重要的作用要弄明白这个问题首先要知道python在执行import语句时到底进行了什么操作按照python的文档它执行了如下操作第1步创建一个新的空的module对象(它可能包含多个module)第2步把这个module对象插入sys.module中第3步装载module的代码(如果需要首先必须编译)第4步执行新的module中对应的代码。在执行第3步时首先要找到module程序所在的位置其原理为如 果需要导入的module的名字是m1则解释器必须找到m1.py它首先在当前目录查找然后是在环境变量PYTHONPATH中查找。 PYTHONPATH可以视为系统的PATH变量一类的东西其中包含若干个目录。如果PYTHONPATH没有设定或者找不到m1.py则继续搜索 与python的安装设置相关的默认路径在Unix下通常是/usr/local/lib/python。事实上搜索的顺序是当前路径 (以及从当前目录指定的sys.path)然后是PYTHONPATH然后是python的安装设置相关的默认路径。正因为存在这样的顺序如果当前 路径或PYTHONPATH中存在与标准module同样的module则会覆盖标准module。也就是说如果当前目录下存在xml.py那么执 行importxml时导入的是当前目录下的module而不是系统标准的xml。了解了这些我们就可以先构建一个package以普通module的方式导入就可以直接访问此package中的各个module了。Python中的package定义很简单其层次结构与程序所在目录的层次结构相同这一点与Java类似唯一不同的地方在于python中的package必须包含一个__init__.py的文件。例如我们可以这样组织一个package:package1/ __init__.py subPack1/ __init__.py module_11.py module_12.py module_13.py subPack2/ __init__.py module_21.py module_22.py……__init__.py可以为空只要它存在就表明此目录应被作为一个package处理。当然__init__.py中也可以设置相应的内容下文详细介绍。好了现在我们在module_11.py中定义一个函数def funA(): print funcA in module_11 return在顶层目录(也就是package1所在的目录当然也参考上面的介绍将package1放在解释器能够搜索到的地方)运行python:from package1.subPack1.module_11 import funcAfuncA()funcA in module_11这样我们就按照package的层次关系正确调用了module_11中的函数。细心的用户会发现有时在import语句中会出现通配符*导入某个module中的所有元素这是怎么实现的呢答案就在__init__.py中。我们在subPack1的__init__.py文件中写__all__ [module_13, module_12]然后进入pythonfrom package1.subPack1 import *module_11.funcA()Traceback (most recent call last): File , line 1, in ImportError: No module named module_11也就是说以*导入时package内的module是受__init__.py限制的。好了最后来看看如何在package内部互相调用。如果希望调用同一个package中的module则直接import即可。也就是说在module_12.py中可以直接使用import module_11如果不在同一个package中例如我们希望在module_21.py中调用module_11.py中的FuncA则应该这样from module_11包名.module_11 importfuncA包机制# a.pydef add_func(a,b):return ab# b.pyfrom a import add_func # Also can be : import aprint (Import add_func from module a)print (Result of 1 plus 2 is: )print (add_func(1,2)) # If using import a , then here should be a.add_funcmodule可以定义在包里面.Python定义包的方式稍微有点古怪,假设我们有一个parent文件夹,该文件夹有一个child子文件夹.child中有一个modulea.py . 如何让Python知道这个文件层次结构?很简单,每个目录都放一个名为_init_.py 的文件.该文件内容可以为空.这个层次结构如下所示:parent --__init_.py--child-- __init_.py--a.pyb.py那么Python如何找到我们定义的module?在标准包sys中,path属性记录了Python的包路径.你可以将之打印出来:import sysprint(sys.path)通常我们可以将module的包路径放到环境变量PYTHONPATH中,该环境变量会自动添加到sys.path属性.另一种方便的方法是编程中直接指定我们的module路径到sys.path 中:importsysimportossys.path.append(os.getcwd()\\parent\\child)print(sys.path)fromaimportadd_funcprint(sys.path)print(Import add_func from module a)print(Result of 1 plus 2 is: )print(add_func(1,2))知识点:如何定义模块和包如何将模块路径添加到系统路径,以便python找到它们如何得到当前路径Python 包的相对导入讲解两个常见错误1. ValueError: Attempted relative import in non-package错误重现目录树123456789case1/├──cat│├──__init__.py│└──cat.py├──dog│├──__init__.py│└──dog.py└──main.py代码123# case1/cat/cat.pyfrom..importdog执行python case1/cat/cat.py错误原因python 使用一个模块的属性 name 来决定他在包结构中的位置所以当直接执行 cat.py 时name \’main\’cat.py 被当作顶层模块来处理了自然不可能导入上层的任何对象了。2. ValueError: Attempted relative import beyond toplevel package错误重现目录树1234567891011case2/├──cat│├──__init__.py│├──cat.py│└──cat.pyc├──dog│├──__init__.py│└──dog.py├──__init__.py└──main.py代码123456# case2/cat/cat.pyfrom..importdog# case2/main.pyimportcat.cat执行python case2/main.py错误原因:这里的 case2 是一个包但当你直接执行 main.py 的时候就没有把完整的 case2 当作一个包来处理了可想而知下层的 cat.py 自然找不到上层包了。即想要相对导入成功必须让下层的被导入对象是上层包或上层包内的对象。正确执行的例子目录树123456789101112case3/├──alpaca.py├──main.py└──pets├──__init__.py├──cat│├──__init__.py│└──cat.py└──dog├──__init__.py└──dog.py代码1234567# case3/pets/cat/cat.pyfrom..dogimportdogfrom..importdog# case3/main.pyfrompets.catimportcat执行python case3/main.py请注意这里的 cat.py 中是不能导入 alpaca 的因为 pets 已经是这个包树的顶层了。另外一篇python的相对路径导入问题用python做项目如果项目大了或者想更好的管理程序总是要使用包。包解决了命名冲突的问题。今天在使用python的相对路径导入的时候遇到了不少的问题。包导入情形1234567891011src/__init__.pymain.pycomponents/__init__.pyexpander.pylanguage_id.pyutilities/__init__.pyfunctions.py如果要在expander.py中引用functions.py中的内容或许这样表示from ..utilities import functions.py1.错误一ValueError:Attemptedrelative import beyond toplevel package这个问题是因为到达了包的最顶层而最顶层不是一个包。解决方法在main.py同级添加一个目录mod包含components和utilities并在mod中添加一个init.py即可解决参见http://stackoverflow.com/questions/4175534/relative-imports-in-python2.错误二ValueError: Attempted relative import in non-package使用相对路径进行导入的文件不能再当作主文件执行。原因如下http://blog.csdn.net/chinaren0001/article/details/73380413.错误三no module named ***在指定路径下没有找到该模块。另外在main.py执行的时候没有指定路径的文件默认与main.py是同一路径。