Import Module

  • 主程序和模块程序在同一目录下:
    – folder:
    —- test.py
    —- module.py

test.py

1
2
3
4
5
def func1() :
print('Hello World!')

def func2() :
print('Python3')

module.py

1
2
3
4
5
def func1() :
print('Python3')

def func2() :
print('Hello World!')

test.py import module.py
在 test.py 文件中或者运行 test.py 时加入 import module,则 test.py import 了整个 module.py。

1
2
3
4
============ RESTART: C:\Users\lizs\Desktop\Python3_test\test.py ============
>>> import module # import 整个模块
>>> module.func2() # 调用模块下的内容的时候要在前面加模块名和点分连接(module.func2())
Hello World!

也可以 import 模块中的个别内容,如:

1
2
3
>>> from module import func1    # import module 模块中的 func1
>>> func1() # 调用的时候就不用加模块名称了(module.func1())
Python3

也可以 from module import *,但是这种方式不会导入下划线_开头的名称。一般情况下不赞成使用这种方法。
注意,出于性能考虑,每个模块在每个解析器会话中只导入一次。因此,如果你修改了已经导入的模块,你必须重启解析器。或者,如果你就是想交互式的测试一下更改的模块,可以使用 importlib.reload(module)module.reload() has been deprecated since version 3.4.

1
2
3
4
5
6
7
8
9
10
11
12
13
# module.py 添加了 func3()
>>> module.func3() # 更新之后直接调用
AttributeError: module 'module' has no attribute 'func3'
>>> import module # 再次 import,无效
>>> module.func3()
AttributeError: module 'module' has no attribute 'func3'
>>> from module import func3 # 无效
ImportError: cannot import name 'func3'
# 使用 importlib.reload(module) 重新导入
>>> improt importlib
>>> importlib.reload(module)
>>> module.func3()
module


  • 主程序在模块所在目录的父(或祖辈)目录。
    folder:
    – test.py
    – package:
    —- module.py

test.py

1
2
3
4
5
def func1() :
print('Hello World!')

def func2() :
print('Python3')

module.py

1
2
3
4
5
def func1() :
print('Python3')

def func2() :
print('Hello World!')

首先,要模块所在的目录(Package,包)创建一个 init.py 文件。然后再 import:

1
2
3
>>> import package.module    # Import 整个 module.py,要用点分连接 Package 和 Module
>>> package.module.func1() # 调用是要完整的 package.module.func() 模式
Python3

1
2
3
>>> from package.module import func1()    # 这种方式 import 只需要 module.py 文件下的func
>>> func2()
Hello World! # 调用也是只需要 func 名称

+

sys.path是python的搜索模块的路径集,是一个list。可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失了!

使用下面方法将路径永久添加到sys.path:

方法一:使用pth文件,在 /Lib/site-packages文件中创建.pth文件,将模块的路径写进去,一行一个路径,

方法二:使用PYTHONPATH环境变量,在这个环境变量中输入相关的路径,不同的路径之间用逗号(英文的)分开,如果PYTHONPATH 变量还不存在,可以创建它!

远程目录通过分布式文件系统挂载后,找出路径用上述方法即可。

1
2
3
4
5
6
7
8
9
10
需要解决一个问题,避免由于之前存在一个同名模块导致加载失败

import sys;
if not "/home/a/" in sys.path:
sys.path.append("/home/a/")
if not 'b' in sys.modules:
b = __import__('b')
else:
eval('import b')
b = eval('reload(b)')