模块调用主要分为:系统模块调用,自定义模块调用。
系统模块调用:
系统模块调用一般使用from…import…/import…的语法可以引用一些系统模块。
import sys
import pygame
自定义模块调用:
1.同一目录下
在进行编码设计的时候,往往需要自定义一些模块,其他程序可以调用这些模块,那么方法和原理还是和上面的系统模块调用是差不多的,让我们来举个例子:
先创建一个目录ModPython,下面定义一个公共模块PublicA.py ,为了更好的理解,我都是写的简单的方法的栗子。
#PublicA.py
def PubA():
print "I'm PublicA in /ModPythonh/PublicA.py"
接下来,还是在这个目录下新建一个python程序A.py去调用这个自定义的模块
#A.py
import PublicA
PublicA.PubA()
运行A.py的结果如下:
I am def PubA_1 in /ModPythonh/PublicA.py
2.不同目录下
建立目录,然后继续按下面的规则来点更复杂的,建好了我们再依次来说说不同情况的跨目录模块调用……ModPython/
————-/A.py
————-/PublicA.py
————-/B /b1.py
————-/B /b2.py
————-/C /c.py
2.1同级目录下子文件调用:
在我们文件结构中,与A.py同级的有PublicA.py还有就是B、C目录了,那么对于A.py来说,b1、b2、c就是子文件了。
如果我们想要在A.py里面调用b1,需要怎么做呢?
如果直接进行import b1,上面试过了会报错,找不到模块b1,因为b1和A不再一个目录下。
那么我们就找到b1的父级目录B,B和和A.py在一个目录下,将B作为一个模块,b1、b2都作为模块里面的方法去调用,为了让系统知道B是一个模块,我们需要在B下面新建一个叫做__init__.py的文件,内容可以为空,这个文件可以告诉python B是一个可以调用的模块了。
————-/B /__init__.py
from B import b1,b2
b1.b1_1()
b2.b2_2()
前提是_init_.py必须为空。
2.2同级目录下子文件调用:
创建目录
ModPython
———/A.py
———/PublicA.py
———/B /__init__.py
———/B /b1.py
———/B /b2.py
———/C /c.py
我们再来看这个目录结构,梳理一下,对于B、C来说他们是同级的,b1和c也是同级的,如果我们需要在c里面调用b该怎么做呢?如果像之前A.py调用的那样,还是会出现这个眼熟的error:ImportError: No module named B,导入的是B模块,而B和c.py文件也不是在一个目录下的了,如果需要那样调用,那么就要先回到上级目录C,再开始from B import b1
跳转目录这个操作,我们需要调用python的sys模块进行实现,具体实现方法如下:
#c.py
import sys
sys.path.append('..')
from B import b1
b1.b1_1()
用append()方法进行追加,..表示回到上一级目录中去。
再来看我们这个栗子,c.py回到上一级就是C这个目录了,对于C来说,和B就是同级目录,B下面已经创建了__init__.py文件,已经是个模块可以用来引入,这个时候from B import b1就没有问题可以顺利调用啦。
了解到这里,关于python跨目录调用自定义模块的问题基本就得以解决了,实在不行,还有一个万能的方法(偷笑(/▽\)):
只要在被调用文件所属的文件夹下创建好__init__.py文件,然后引入sys模块,在用append进行追加的时候直接写上需要调用文件的绝对路径。
3.调用自建模块通用方法
如果我们要调用B里面的文件,只需要找到B的绝对路径,假设是C:\Users\ModPython\B,那append就这么写:
sys.path.append('C:\\Users\\ModPython')