2018-10-09 Python23 模块

导入的模块,一般先从当前文件夹搜索,如果当前文件夹没有再去系统文件夹搜索。

🌰:random 模块

In [13]: import random

In [14]: random.
random.BPF              random.expovariate      random.randrange
random.LOG4             random.gammavariate     random.sample
random.NV_MAGICCONST    random.gauss            random.seed
random.RECIP_BPF        random.getrandbits      random.setstate
random.Random           random.getstate         random.shuffle
random.SG_MAGICCONST    random.lognormvariate   random.triangular
random.SystemRandom     random.normalvariate    random.uniform
random.TWOPI            random.paretovariate    random.vonmisesvariate
random.betavariate      random.randint          random.weibullvariate
random.choice           random.random           

In [14]: random.ran
random.randint    random.random     random.randrange  

In [14]: random.randint(0,10)
Out[14]: 2

 

已安装模块 - 存放路径:

In [15]: import os

In [16]: os.__file__
Out[16]: '/usr/lib/python3.5/os.py'

所有模块都是一个.py文件:
      都是源码,用到的时候可以看看。

mm@mm-virtual-machine:~/桌面$ cd /usr/lib/python3.5/
mm@mm-virtual-machine:/usr/lib/python3.5$ ls -l
总用量 4488
-rw-r--r-- 1 root root  36970 11月 29  2017 os.py
...

 
 

🌰下载模块:安装 pygame 模块

# 安装模块用 pip

#安装curl
sudo apt install curl

#安装pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user

#升级pip
pip install --upgrade pip

#安装pygame到python2里面
pip install pygame --user

-------------------------------------------------------------------------

#安装pip3:
sudo apt install python3-pip

#安装pygame到python3里面:
pip3 install pygame --user

 
 

自定义模块:

自定义一个模块 cathie.py

  1 def test():
  2     print("--- cathie test ---")
  3 
  4 #当单独执行此文件,而不是作为一个模块被导入到其他文件中时,执行以下代码测试程序
  5 if __name__ == "__main__":
  6     test()

新建 main.py

  1 # import cathie
  2 # cathie.test()
  3 
  4 # from cathie import test,aaa,...
  5 from cathie import *   #尽量避免用这种,假如两个模块的函数重名,后面导入的方法会覆盖前面的
  6 test()

运行 main.py

mm@mm-virtual-machine:~/桌面/mm$ ls
cathie.py  main.py
mm@mm-virtual-machine:~/桌面/mm$ python3 main.py
--- cathie test ---

文件夹下,多了一个 __pycache__ 文件:
引用的那个模块编译后的二进制文件(字节码)缓存起来,避免多次重复编译浪费时间。

mm@mm-virtual-machine:~/桌面/mm$ ls
cathie.py  main.py  __pycache__
mm@mm-virtual-machine:~/桌面/mm$ tree
.
├── cathie.py
├── main.py
└── __pycache__
    └── cathie.cpython-35.pyc  #引用的那个模块编译后的二进制文件(字节码)给它存起来,避免多次重复编译浪费时间

1 directory, 3 files

 
 

__all__ 属性:

  • 如果不写__all__属性,用哪种方式导入都可以被访问。
  • 如果__all__属性:
    • import cathie as ca方式导入,还是都可以被访问的。
    • from cathie import *方式导入,那么包含在list中的全局变量名才可以被访问。
  1 __all__ = ["test1","Test"]
  2 
  3 def test1():
  4     print("--- cathie test1 ---")
  5 
  6 def test2():
  7     print("--- cathie test2 ---")
  8     
  9 num = 2
 10 
 11 class Test(object):
 12     pass
 13     
 14 
 15 #当单独执行这个文件,而不是作为一个模块被导入到其他文件中时,执行以下代码测试程序
 16 if __name__ == "__main__":
 17     test1() 
 18     test2()

导入模块测试:

In [1]: from cathie import *

In [2]: test1()
--- cathie test1 ---

In [3]: Test()
Out[3]: <cathie.Test at 0x7f1e7e654438>

In [4]: test2()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-35ebc1c532fc> in <module>()
----> 1 test2()

NameError: name 'test2' is not defined

In [5]: num
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-cb54072dd80a> in <module>()
----> 1 num

NameError: name 'num' is not defined

 

包:

  1. 文件夹下建 __init__.py 文件
mm@mm-virtual-machine:~$  ls
display.py  Msg

mm@mm-virtual-machine:~$  tree
.
├── display.py
└── Msg
    ├── __init__.py
    ├── recvmsg.py
    └── sendmsg.py

2 directories, 7 files

2 和 3 并列,也可以都写,互不影响。

  1. __init__.py 里写 __all__ = [] 变量,在list中写入模块的名字。
    外部程序导入包内模块:from 包名 import *
mm@mm-virtual-machine:~$  cat Msg/__init__.py 
__all__ = ["sendmsg","recvmsg"]

mm@mm-virtual-machine:~$  ipython3
In [1]: from Msg import *

In [2]: sendmsg.test1()
--- sendmsg test1 ---

In [3]: recvmsg.test2()
--- recvmsg test2 ---
  1. __init__.py 里面导入包内模块:import modulesimport前加from .python3可用。
    外部程序导入包: import Package
mm@mm-virtual-machine:~$  cat Msg/__init__.py
from . import sendmsg
from . import recvmsg
print("\t\t\t*********** Msg Package **********")


mm@mm-virtual-machine:~$  ipython3 
In [1]: import Msg
            *********** Msg Package **********

In [2]: Msg.
Msg.recvmsg  Msg.sendmsg  

In [2]: Msg.sendmsg.test1()
--- sendmsg test1 ---

In [3]: Msg.recvmsg.test2()
--- recvmsg test2 ---

 


构建、打包(发布)、安装
 

构建模块:

在包的同目录下建 setup.py 文件:

from distutils.core import setup

setup(name="MsgUtil", version="1.0", description="mm's MsgUtil module", 
      author="mm", py_modules=['package1.module1', 'package1.module2', 
                               'package2.module3', 'package2.module4'])

执行 python setup.py build 命令:

# 构建后的目录结构,多了一个build文件夹:
.
├── build
│   └── lib
│       ├── package1
│       │   ├── module1.py
│       │   ├── module2.py
│       │   └── __init__.py
│       └── package2
│           ├── module3.py
│           ├── module4.py
│           └── __init__.py
├── setup.py
├── package1
│   ├── module1.py
│   ├── module2.py
│   └── __init__.py
└── package2
    ├── module3.py
    ├── module4.py
    └── __init__.py

 

生成发布压缩包📦

执行 python setup.py sdist 命令:

# 打包后的目录结构,多了一个dist目录和一个MANIFEST文件,dist目录下放着压缩包。
.
├── build
│   └── lib
│       ├── package1
│       │   ├── module1.py
│       │   ├── module2.py
│       │   └── __init__.py
│       └── package2
│           ├── module3.py
│           ├── module4.py
│           └── __init__.py
├── dist
│   └── MsgUtil-1.0.tar.gz
├── MANIFEST
├── setup.py
├── package1
│   ├── module1.py
│   ├── module2.py
│   └── __init__.py
└── package2
    ├── module3.py
    ├── module4.py
    └── __init__.py

这个模块的tar.gz可以发布到Github上面去。

 

安装

  • 别人要使用你的模块,可以下载你的压缩包文件。
  • 解压
  • 安装到系统目录。
  • 使用
#解压
tar -zxvf MsgUtil-1.0.tar.gz

#解压后的目录结构
.
├── PKG-INFO   #构建模块时setup()函数中传入的参数信息
├── setup.py
├── package1
│   ├── module1.py
│   ├── module2.py
│   └── __init__.py
└── package2
    ├── module3.py
    ├── module4.py
    └── __init__.py


#安装到系统路径
进入setup.py文件的所在文件夹
python setup.py install 


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

推荐阅读更多精彩内容

  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 2,226评论 0 4
  • 1.1Python中的模块介绍和使用 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#...
    TENG书阅读 405评论 0 0
  • 凤凰涅槃_a5ec阅读 175评论 1 4
  • * 把红红火火哈哈哈 新浪
    好快快快阅读 198评论 0 0
  • 文|蓝小小 难得的周末,一大早跟心爱的人相约起来共度美好。说不完的话,拍不完的照,笑不完的梗,还有断不了的情。 紧...
    蓝小小啊阅读 299评论 2 3