03月21, 2019

模块

通常来说,比较正规的工程不会把所有代码放在一个py文件里,我们会把代码拆成各个模块,分别调用。对python来说,拆成各个模块可以看做拆成各个py文件。

搜索路径

通常来说,同文件夹下的py文件可以直接import。

def print_hello():
    print "hello"

我们把这个保存至hello.py

import hello
hello.print_hello()

在run.py里import,然后调用print_hello() 目录结构

...../
     hello.py
     run.py

hello.py和run.py在同一目录下,可以直接import 如果在不同路径下,可以在sys.path里手动加入你想import的路径

import sys
sys.path.append('/home/zhuzekun/course')
import hello
hello.print_hello()

如果run.py不在/home/zhuzekun/course文件夹下,手动加入这个路径,就可以import这个路径下的hello.py

通常一个工程不可能只有一层目录结构,并且也不会一个一个path去append到sys里,常用的做法是包,一个目录及其子目录组成的一个包(可以看做一个库)。 举个例子

/home/zhuzekun/course
├── __init__.py
├── __init__.pyc
├── m1
│   ├── b.py
│   ├── b.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   └── m1_1
│       ├── a.py
│       ├── a.pyc
│       ├── __init__.py
│       └── __init__.pyc
└── m2
    ├── __init__.py
    └── run.py

这是一个course文件夹,里面有m1和m2这两个文件夹,同时m1中又有一个子文件夹m1_1。 文件b.py

def hello_b():
    print "hello b"

文件a.py

def hello_a():
    print "hello a"

文件run.py

import sys
import os
sys.path.append('/home/zhuzekun/')
from course.m1 import b
from course.m1.m1_1 import a

if __name__ == '__main__':
    b.hello_b()
    a.hello_a()

在run.py中要调用m1/b.py和m1/m1_1/a.py,只需要导入course这个包就可以了。

本文链接:http://www.yuqiaochuang.com/post/模块.html

-- EOF --

Comments

""