python模块和包,项目结构

Python在处理功能复用和功能颗粒度划分时采用了类、模块、包的结构。

模块

模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者命名空间

模块分为三种:
  • 自定义模块
  • 内置标准模块
  • 开源模块(第三方)
模块属性__name__:

值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为main,如果是作为模块被其他文件导入,它的值就是其文件名。

#moduel1.py
def say(word):
    print word]

#caller.py
import module1
print __name__
print module1.__name__
module1.say('hello')

>>>>
__main__
module1
hello
模块搜索路径

Python import module 的搜索路径由sys.path指定,实质为一个列表,列表索引先后决定搜索优先级。

sys.path列表优先级排序:

第一优先级为当前执行脚本的目录
第二优先级为PYTHONPATH;
第三优先级为安装位置。

通过函数添加自编译的模块
  • sys.path.append(PATH/filename) 加在sys.path的最后
  • sys.path.insert(0,PATH/filename) 加在sys.path的最前
其实增加自编译的模块较为官方的方法是通过.pth文件添加:

Ubuntu第三方模块目录名为:dist-packages
Windows和Redhat第三方模块目录名为:site-packages
在site-packages/ dist-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了。

导入模块四种方法
    import module1,module2
    from 模块名 import 函数名
    from  模块名 import 函数名 as 函数别名
    import 模块名 as 函数别名

包名的 命名方式 和变量名一致,小写字母 + _

如果您将一个或多个模块放在 文件中,那么您有一个包。简而言之,包本质上是一个包含代码的文件夹。包实际上只是一个目录,但是所有包都必须包含一个__init__.py 文件。该文件告诉Python将目录视为包含包

常见的包结构如下:

image.png

最简单的情况下,只需要一个空的 init.py 文件即可。

导入包的方法:
import 包名.模块名
from 包名 import 模块名
import 包名(注意__init__.py函数的内容)

注意: 第一种 from 包名 import 模块名,不用在包里的__init__写入 import 模块名


pip 安装第三方模块

第三方模块 通常是指由 知名的第三方团队 开发的 并且被 程序员广泛使用 的 Python 包 / 模块

  • pip 是一个现代的,通用的 Python 包管理工具
    提供了对 Python 包的查找、下载、安装、卸载等功能

  • 安装和卸载命令如下:

# 将模块安装到 Python 2.x 环境
$ sudo pip install pygame
$ sudo pip uninstall pygame

# 将模块安装到 Python 3.x 环境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

发布模块

如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作:

1. 创建 setup.py
  • setup.py 的文件
    安装、部署、打包的脚本。在 setup.py 文件中写明依赖的库和版本,以便到目标机器上能够使用python setup.py install安装。
from distutils.core import setup

setup(name="hm_message",  # 包名
      version="1.0",  # 版本
      description="itheima's 发送和接收消息模块",  # 描述信息
      long_description="完整的发送和接收消息模块",  # 完整描述信息
      author="itheima",  # 作者
      author_email="itheima@itheima.com",  # 作者邮箱
      url="www.itheima.com",  # 主页
      py_modules=["hm_message.send_message",
                  "hm_message.receive_message"])

有关字典参数的详细信息,可以参阅官方网站:https://docs.python.org/2/distutils/apiref.html

2. 构建模块
$ python3 setup.py build
3. 生成发布压缩包
$ python3 setup.py sdist

注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!


结构说明
推荐结构参考

项目结构

对于开发人员而言,可以遵循一系列准则,以确保为每个项目形成良好的结构。这创造了一种通常被大多数程序员接受的通用方法。这样做的好处是每个人都学会按照这些指导方针工作,从而消除了在查看人员项目时可能发生的许多混乱。

  • myproject(项目名)/
    __init__.py 该文件告诉Python将目录视为包含包
    __main__.py 写主要逻辑
    test/ 一个常犯的错误是将单元测试部分代码放在包目录的外面。这些测试实际上应该被包含在软件的子包中

  • 自述文件 -拥有一段文本可以让其他开发人员和潜在用户受益。它还为开发人员提供了一种传达程序特定内容的方法,例如某个特性。README.rst /README.md

  • requirements.txt - 此文件列出项目所需的任何第三方依赖项。它让其他人知道为了处理项目需要哪些库。简单来说,它是一个pip安装要求列表。
    示例:

Flask == 0.12 
Jinja == 2.9.5 
MarkupSafe == 0.23 
Werkzeug == 0.11.15 
argparse == 1.2.1 
click == 6.7 
wsgiref == 0.1.2
  • setup.py - 安装、部署、打包的脚本。在 setup.py 文件中写明依赖的库和版本,以便到目标机器上能够使用python setup.py install安装。
  • scripts/ 项目用到的各种脚本
下面这些顶层目录也经常出现:
  • docs/ 项目文档 ,一般来说里面还包含config.py
  • etc/ 用来存放配置文件的样例
  • tools/ 用来存放与工具有关的shell脚本
  • bin/ 用来存放将被setup.py安装的二进制脚本
  • data/ 用来存放其他类型的文件,如媒体文件
如果需要发行自己的模块,那么顶层目录还需要下面三个文件:
  • setup.cfg: 包含 setup.py 默认命令选项的 ini 文件

  • LICENSE.txt 项目许可说明文件。--如果需要使用setuptools等工具进打包发行, 那么需要一个许可文件。

  • MANIFEST.in:装箱清单文件 ,当需要打包源码中不自动包含的附加文件时使用

快速生成项目结构工具

这里介绍两款工具: hatch、cookiecutter


cookiecutter使用

cookiecutter文档

一、按流程生成项目
  • 1、安装
$ pip install --user cookiecutter
  • 2、然后,克隆一个Cookiecutter项目模板:
 # 按提示输入内容即可,可以去寻找相应工程模板,如果Django项目结构是 https://github.com/pydanny/cookiecutter-django
$ git clone https://github.com/audreyr/cookiecutter-pypackage.git
  • 3、修改cookiecutter.json中定义的变量。然后生成你的项目打开骨架项目。如果您需要稍微更改它,请执行此操作。
{
  "full_name": "Audrey Roy Greenfeld",#版权所有者命名
  "email": "644812368@qq.com",
  "github_username": "LittleTrue",  #项目模板作者名
  "project_name": "Python SpiderTest",  #项目名
  "project_slug": "{{ cookiecutter.project_name.lower().replace(' ', '_').replace('-', '_') }}",
  "project_short_description": "Python Boilerplate contains all the boilerplate you need to create a Python package.", #项目描述
  "pypi_username": "{{ cookiecutter.github_username }}",
  "version": "0.1.0", #项目版本
  "use_pytest": "n",
  "use_pypi_deployment_with_travis": "y",
  "add_pyup_badge": "n",
  "command_line_interface": [
    "Click",
    "No command-line interface"
  ],
  "create_author_file": "y",
  "open_source_license": [
    "MIT license",
    "BSD license",
    "ISC license",
    "Apache Software License 2.0",
    "GNU General Public License v3",
    "Not open source"
  ]
}
 cookiecutter cookiecutter-pypackage/
二、直接生成项目
cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git

也可以直接使用上面命令代替上面2,3步, 不过生成项目时,系统将提示您输入一组值,例如full_name,email和project_name。输入您的信息,或者只需按返回/输入即可接受默认值。
此信息将用于填写项目的空白。例如,您的姓名和年份将被放入LICENSE文件中。

三、cookiecutter-pypackage.git默认样本文件
AUTHORS.rst      MANIFEST.in      docs             tox.ini
CONTRIBUTING.rst Makefile         requirements.txt
HISTORY.rst      README.rst       setup.py
LICENSE          boilerplate      tests

这些文件对应github.com:audreyr/cookiecutter-pypackage.git上文件名为{{cookiecutter.project_slug}}的目录里的文件

四、定制私人项目模板

您可能还想创建一个repo,以不同的名称命名,并将其作为您自己的新Cookiecutter项目模板推送,以方便将来使用
定制自己的项目模板带github或本地,是更高级的学习
参考

使用问题

1、构建时设置的cookiecutter.json中的值会在构建时按ENTER当成默认值
2、如果cookiecutter命令失效,需要配环境变量 ,把C:\Users\LittleTrue\AppData\Roaming\Python\Python37\Scripts 加入系统Path变量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,517评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,087评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,521评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,493评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,207评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,603评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,624评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,813评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,364评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,110评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,305评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,874评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,532评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,953评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,209评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,033评论 3 396
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,268评论 2 375

推荐阅读更多精彩内容