在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py文件
graphics/
__init__.py
primitive/
__init__.py
line.py
fill.py
text.py
formats/
__init__.py
png.py
jpg.py
以下三种导入包形式:
import graphics.primitive.line from graphics.primitive import line import graphics.formats.jpg as jpg2.控制模块被全部导入的内容
当使用’from module import *’ 语句时将该模块中所有方法导出,如何从模块或包导出的符号进行精确控制
# somemodule.py
def spam():
pass
def grok():
pass
blah = 42
# Only export 'spam' and 'grok'
__all__ = ['spam', 'grok'] #定义一个变量 __all__ 来明确地列出能够导出的内容
3.使用相对路径名导入包中子模块
mypackage/
__init__.py
A/
__init__.py
spam.py
grok.py
B/
__init__.py
bar.py
(1)如果模块mypackage.A.spam要导入同目录下的模块grok:
# mypackage/A/spam.py from mypackage.A import grok from . import grok
(2)如果模块mypackage.A.spam要导入不同目录下的模块B.bar (相对路径)
# mypackage/A/spam.py from ..B import bar4.将模块分割成多个文件
将如下文件中两个模块进行分割到不同文件中,但不影响运行逻辑
# mymodule.py
class A:
def spam(self):
print('A.spam')
class B(A):
def bar(self):
print('B.bar')
(1)首先用mymodule目录来替换文件mymodule.py
mymodule/
__init__.py
a.py
b.py
(2)在a.py文件中插入以下代码:
# a.py
class A:
def spam(self):
print('A.spam')
(3)在b.py文件中插入以下代码:
# b.py
from .a import A
class B(A):
def bar(self):
print('B.bar')
(4)在 __init__.py 中,将2个文件粘合在一起
# __init__.py from .a import A from .b import B
(5)产生的包MyModule将作为一个单一的逻辑模块
>>> import mymodule >>> a = mymodule.A() >>> a.spam() A.spam >>> b = mymodule.B() >>> b.bar() B.bar >>>5.利用命名空间导入目录分散的代码
希望能用共同的包前缀将所有组件连接起来,不是将每一个部分作为独立的包来安装
在不同的目录里有相同的命名空间,但是要删去用来将组件联合起来的__init__.py文件
foo-package/
spam/
blah.py
bar-package/
spam/
grok.py
在上述这2个目录里,都有着共同的命名空间spam。在任何一个目录里都没有__init__.py文件
>>> import sys >>> sys.path.extend(['foo-package', 'bar-package']) >>> import spam.blah >>> import spam.grok >>>6.重新加载模块
对模块源码进行了修改,想重新加载已经加载的模块
用imp.reload()来重新加载先前加载的模块
# spam.py
def bar():
print('bar')
def grok():
print('grok')
>>> import spam
>>> from spam import grok
>>> spam.bar()
bar
>>> grok()
grok
>>>
修改后重新加载
# spam.py
def bar():
print('bar')
def grok():
print('New grok')
>>> import imp
>>> imp.reload(spam)
>>> spam.bar()
bar
>>> spam.grok() # Notice new output
New grok
>>>
7.运行目录或压缩文件
如果你的应用程序已经有多个文件,你可以把你的应用程序放进它自己的目录并添加一个__main__.py文件。
myapplication/
spam.py
bar.py
grok.py
__main__.py
可以简单地在顶级目录运行Python解释器:
bash % python3 myapplication #脚本运行 解释器将执行__main__.py文件作为主程序
打包文件同样适用
bash % ls spam.py bar.py grok.py __main__.py bash % zip -r myapp.zip *.py bash % python3 myapp.zip ... output from __main__.py ...8.读取位于包中的数据文件
mypackage/
__init__.py
somedata.dat 数据文件
spam.py 数据读取功能
spam.py文件需要读取somedata.dat文件中的内容
# spam.py import pkgutil data = pkgutil.get_data(__package__, 'somedata.dat')9.将文件夹加入到sys.path
(1)使用PYTHONPATH环境变量来添加
bash % env PYTHONPATH=/some/dir:/other/dir python3 Python 3.3.0 (default, Oct 4 2012, 10:17:33) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/some/dir', '/other/dir', ...] >>>
(2)创建一个.pth文件,将目录列举出来
# myapplication.pth /some/dir /other/dir
该文件通常位于/usr/local/lib/python3.3/site-packages 或者 ~/.local/lib/python3.3/sitepackages。当解释器启动时,.pth文件里列举出来的存在于文件系统的目录将被添加到sys.path
10. 通过字符串名导入模块使用importlib.import_module()函数来手动导入名字为字符串给出的一个模块或者包的一部分
>>> import importlib
>>> math = importlib.import_module('math')#mport_module只是简单地执行和import相同的步骤,但是返回生成的模块对象。只需要将其存储在一个变量,然后像正常的模块一样使用
>>> math.sin(2)
0.9092974268256817
>>> mod = importlib.import_module('urllib.request')
>>> u = mod.urlopen('http://www.python.org')
>>>
11.创建新的Python环境
(1)安装第三方包
pip install --user packagename
(2)配置环境:
可以使用 pyvenv 命令创建一个新的“虚拟”环境。 这个命令被安装在Python解释器同一目录,或Windows上面的Scripts目录中
bash % pyvenv Spam bash % bash % cd Spam bash % ls bin include lib pyvenv.cfg bash % bash % Spam/bin/python3 Python 3.3.0 (default, Oct 6 2012, 15:45:22) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from pprint import pprint >>> import sys >>> pprint(sys.path) ['', '/usr/local/lib/python33.zip', '/usr/local/lib/python3.3', '/usr/local/lib/python3.3/plat-darwin', '/usr/local/lib/python3.3/lib-dynload', '/Users/beazley/Spam/lib/python3.3/site-packages'] >>>12.分发包
如果你想分发你的代码,第一件事就是给它一个唯一的名字,并且清理它的目录结构
projectname/
README.txt
Doc/
documentation.txt
projectname/
__init__.py
foo.py
bar.py
utils/
__init__.py
spam.py
grok.py
examples/
helloworld.py
...
(1)首先要编写一个 setup.py
# setup.py
from distutils.core import setup
setup(name='projectname',
version='1.0',
author='Your Name',
author_email='you@youraddress.com',
url='http://www.you.com/projectname',
packages=['projectname', 'projectname.utils'],
)
(2)创建一个 MANIFEST.in 文件,列出所有在你的包中需要包含进来的非源码文件
# MANIFEST.in include *.txt recursive-include examples * recursive-include Doc *
(3)setup.py 和 MANIFEST.in 文件放在包的最顶级目录projectname下
(4)执行命令来创建一个源码分发包
% bash python3 setup.py sdist
最终会根据系统平台创建一个文件比如”projectname-1.0.zip” 或 “projectname-1.0.tar.gz”,



