cookbook_模块和包

1把模块按层次结构组织成包

只需确保每一个目录中都定义了__init__.py便可。python

2对全部符号的导入进行精确控制

当用户使用from module import * 语句时,咱们但愿对从模块或包中导入的符号进行精确控制。app

在模块中定义一个变量__all__,用来显示列出可导出的符号名。编码

__all__ = ["spam","grok"]spa

 

3使用相对名称来导入包中的子模块

mypackage/
  __init__.py
  A/
    __init__.py
    spam.py
    grok.py
  B/
    __init__.py
    bar.py
    
 #spam.py
 from . import grok
 from ..B import bar

使用该方法来导入包内模块,能够很好的减小硬编码导入模块,若是使用绝对名称导入,若是最顶端的文件名变化全部的导入都将出现问题。code

ps.blog

执行脚本出现导入错误时  python3 -m mypackageip

 

4将模块分解成多个文件

在不破坏使用结构的状况下,将一个模块分解成多个模块开发

首先将模块变成包,在包内__init__.py文件内将子模块导入。字符串

 

5让各个目录下的代码在统一的命名空间下导入

foo_package/
  spam/
    blah.py
bar_package/
  spam/
    grok.py
    
import sys
sys.path.extend(["foo_package","bar_package"])
import spam.blah
import spam.grok

在这两个目录中 spam做为公共的命名空间,注意这两个目录中都没有__init__.py文件。get

 

6从新加载模块

开发环境中使用,尽可能不在生产环境使用

import imp
import math
imp.reload(math)

 

7让目录或zip文件成为可运行的脚本

myapplication/
  spam.py
  bar.py
  grok.py
  __main__.py
  
  python myapplication
  
  若是包含__main__.py文件,就能够看成脚原本运行,会运行__main__.py里的方法

 

8读取包中的数据文件

mypackage/
  __init__.py
  somedata.dat
  spam.py
  
import pkgutil
data = pkgutil.get_data(__package__,"somedata.dat")

# data会获得一个字节串
 

9添加目录到sys.path中

三种解决方案,第一种是使用PYTHONPATH环境变量来添加。

env PYTHONPATH = /some/dir:/other/dir python3

 

第二种是经过建立.pth文件,将.pth文件放在python的site_packages

#mtapplication
/some/dir
/other/dir

第三种是硬编码到代码中

import sys
sys.path.insert(0,"/some/dir")
sys.path.insert(0,"/other/dir")

 

10使用字符串中给定的名称来导入模块

import importlib
math = importlib.import_module("math")
相关文章
相关标签/搜索