解决问题方面了解import
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去一个地方一个地方的寻找模块的。
注意:项目中文件夹和包的区别
文件夹下面有__init__.py文件,则文件夹是包
否则就是文件夹
自定义的外部模块使用则,需要用sys.path.append('/home/bao/py'),里面的参数是自定义的python的路径地址
然后才能调用from 包名称 import class名称引入自定义的类
原理上了解import
一、sys.path :保存系统引入的classpath的路径信息(包括主模块的路径,python的home路径,pythonpath路径等 )
模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend(路径的绝对路径))即可。下面是sys.path在Windows平台下的添加规则。
二、sys.modules: Python中所有加载到内存的模块都放在sys.modules
三、import原理:
Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。
如果没有加载则从sys.path目录中按照模块名称查找模块文件,模块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。
四、模块导入后的使用情况
import只能导入模块,不能导入模块中的对象(类、函数、变量等)。如一个模块A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,
只能用import A,然后调用用A.getName来使用。如果想只导入特定的类、函数、变量则用from A import getName即可
import 的时候,如果后面跟着是包路径,则modules中存放的是包路径下__init__.py文件路径
如果后面跟着是模块,则modules中存放的是模块的文件路径