pythonimport目录
‘壹’ python import 路径问题 新手
以下为纯手打,下面给几个demos:
说明:
moles所在的目录在python里叫package, 下面是一个名为 IsDir的package(实际上就是一个目录), package下面有4个moles(A, B, C, D)和一个__init__.py文件,目录结构如下:
IsDir/
A.pyB.pyC.pyD.py__init__.py
大体来讲,有两种方法可以调用某目录下(包括递归目录)的moles.
一. __init__.py为空时
1.1以下为调用moleA的代码:
#!/usr/bin/envpython
fromIsDirimportA
A.say()
输出:
ThisismoleA!
1.2 如果想调用moleA,B,C,D呢?
方法1.
#!/usr/bin/envpython
fromIsDirimportA
fromIsDirimportB
fromIsDirimportC
fromIsDirimportD
A.say()
B.say()
C.say()
D.say()
方法2.
#!/usr/bin/envpython
importIsDir.A
importIsDir.B
importIsDir.C
importIsDir.D
fromIsDirimport*
A.say()
B.say()
C.say()
D.say()
错误示例1:
#!/usr/bin/envpython
importIsDir.A
A.say()
错误示例2:
#!/usr/bin/envpython
fromIsDirimport*
A.say()
错误的原因:
IsDir/目录下__init__.py为空时,直接importIsDir.A或者fromIsDirimport*是无效的.
从官方文档里可以看到,__init__.py 里没有__all__=[mole1,mole2,...]时,
fromIsDirimport* 只能保证IsDir被imported, 所以此时IsDir里的moles是无法被imported,
此时只有如我上面所写的代码所示才能正确执行,否则是错误的。官方解释为:importIsDir.A并无任何意义,只有接着执行fromIsDirimport*后,importIsDir.A语句里的moleA才会被定义,所以完整的调用因改为: 1. import IsDir.A 2. from IsDir import *。
二. __init__.py用all=[...]指定该package下可以被imported进去的mole
__init__.py里写入如下内容:
%catIsDir/__init__.py
__all__=["A","B"]
然后使用之:
#!/usr/bin/envpython
fromIsDirimport*
A.say()
B.say()
结果:
%pythontest.py
ThisismoleA!
ThisismoleB!
错误实例:
#!/usr/bin/envpython
fromIsDirimport*
C.say()
以上示例之所以错误,是因为C并没有在__all__=["A","B"]里制定,由此可见,packageIsDir下面的__init__.py里,__all__=[...]具有隔离moles的作用。
补充:
mole A, B, C,D里我分别只定义了一个method, 例如,以下为mole A的code:
%catIsDir/A.py
defsay():
print"ThisismoleA!"
后记:
谢谢这位同学,回答你的问题感觉很有收获,顺便又把python温习了一遍。回头把这些总结贴到我的blog上以上为手写,望采纳,共勉。
=============================================================
老子写了这么多居然采用了另一个简陋的答案,mlgb的,枉我熬夜给你答题。这种白痴楼主就不配在这里问问题。
‘贰’ Python 中的import 机制
解释器 在执行语句时,遵循作用域原则。因为这和作用域有关系, 如果在顶层导入模块,此时它的作用域是全局的;如果在函数内部导入了模块,那它的作用域只是局部的 ,不能被其它函数使用。如果其它函数也要用到这个模块,还需要再次导入比较麻烦。
在用import语句导入模块时最好按照这样的顺序:
绝对路径 就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
相对路径 就是以当前文件为基准进行一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符
形如from moleB import ClassB语句,根据Python内部import机制,执行细分步骤:
总结:from moleB import ClassB有两个过程,先from mole,后import ClassB。
当然将moleA.py语句 from moleB import ClassB改为:import moleB,将在第二次执行moleB.py语句from moleA import ClassA时报错:ImportError: cannot import name ‘classA’
在一个文件下同时有 init .py文件、和其他模块文件时,该文件夹即看作一个包(package)。包的导入 和模块导入基本一致,只是导入包时,会执行这个 init .py,而不是模块中的语句。
而且,如果只是单纯地导入包【形如:import xxx】,而包的 init .py中有没有明确地的其他初始化操作,则:此包下的模块 是不会被自动导入的。当然该包是会成功导入的,并将包名称放入当前.py的Local命名空间中。
参考文章:
Python中import机制
Python 3.x可能是史上最详解的【导入(import)】
在Python中以绝对路径或者相对路径导入文件的方法
Python的模块引用和查找路径
‘叁’ 详解Python中import方法引入模块
在python用import或者from...import或者from...import...as...来导入相应的模块,作用和使用方法与C语言的include头文件类似。其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度。
python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和php非常相似,但是它们的具体细节还不是很一样。因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进行引入。
下面总结一下import的几种情况:
python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构:
`-- src
|-- mod1.py
`-- test1.py
若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;
(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
`-- test1.py
若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
|-- sub
| `-- test2.py
`-- test1.py
若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
import sys
sys.path.append("..")
import mod1
import mod2.mod2
‘肆’ 怎么从python引入自己的模块
1.如果导入的模块和主程序在同个目录下,直接import就行了
2.如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录整个也当成一个模块,然后直接通过“import 子目录.模块”导入即可。
3.如果导入的模块是在主程序所在目录的父目录下,则要通过修改path来解决,有两种方法:
(1)通过”import sys,sys.path.append('父目录的路径')“来改变,这种方法属于一次性的,只对当前的python解释器进程有效,关掉python重启后就失效了。
(2)直接修改环境变量:在windows中是 “ set 变量=‘路径’ ” 例如:set PYTHONPATH=‘C:\test\...’ 查看是否设置成功用echo %PYTHONPATH%,而且进到python解释器中查看sys.path,会发现已经有了新增加的路径了。这种方式是永久的,一次设置以后一直都有效。在linux中是 "export 变量=‘路径’ “,查看是" echo $变量 "
通过修改path是通用的方法,因为python解释器就是通过sys.path去一个地方一个地方的寻找模块的。
‘伍’ 出现“python import路径”问题,该如何处理
1.python import模块时, 是在sys.path里按顺序查找的;
2.sys.path是一个列表,里面以字符串的形式存储了许多路径;
3.当你增加里新的放模块的目录时,可以from sys import path path.append(r" 路径 ")。