Python的模块

模块的使用

>>> import math
>>> math.pow(2,3)
8.0

math就是一个模块,import引入这个模块,使用了模块中pow()这个函数。模块的好处就是:拿来就用,不用自己重写。

>>> dir(math)
['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>> math.pi
3.141592653589793

通过dir(),可以发现math模块中有以上这些函数。

说到底,模块也是像我们之前写过的后缀为.py的文件,因此我们可以自己定义模块。
例如:
在~/documents的路径下创建了文件:mymodule.py
文件内容如下:

#!/usr/bin/env Python
# coding=utf-8

name = "Python"

先告诉解释器,我自定义的模块放在哪里:

>>> import sys
>>> sys.path.append("~/documents/mymodule.py")

接着,使用import引入这个模块,并使用里面的变量。

>>> import mymodule
>>> mymodule.name
'Python'

解释器如何判断.py文件为程序执行还是作为模块引入

mymodule.py文件修改如下:

#!/usr/bin/env Python
# coding=utf-8

def name():
    return "Python"

if __name__ == '__main__':
    print name()

作为程序执行时:

$ python mymodule.py
Python

作为模块导入时:

>>> import sys
>>> sys.path.append("~/documents/mymodule.py")
>>> import mymodule
>>> mymodule.name()
'Python'

此时,mymodule.py中的函数name()就是一个属性:

>>> dir(mymodule)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'name']

同一个.py文件,可以作为程序直接运行,也可以作为模块导入

>>> __name__
'__main__'
>>> mymodule.__name__
'mymodule'

如果要作为程序执行,那么__name__ == '__main__'
如果作为模块导入,即变量__name__的值是模块名称。
用这种方式,便可区分是执行程序还是模块引入。
一帮情况下,如果是作为模块导入,可以不写:
if __name__ == '__main__'

模块的位置

上面提到,为了使得我们自己写的模块能够被Python解释器知道,需要这样:sys.path.append("~/documents/mymodule.py")。其实,在Python中,所有模块都被加入到sys.path里面了。用如下的方式可以看到模块所在位置:

>>> import sys
>>> import pprint 
>>> pprint.pprint(sys.path)
['',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages',
 '~/documents/mymodule.py']

从中也可看到我们自己写的模块的位置。凡是在上面列表中所包括的位置内的.py文件都可以作为模板引入。

因此,复制文件mymodule.py到 '/Library/Python/2.7/site-packages'的位置下,改名为mymodule2.py:

$ sudo cp mymodule.py /Library/Python/2.7/site-packages/mymodule2.py
Password:
$ ls /Library/Python/2.7/site-packages/mymodule2.py
/Library/Python/2.7/site-packages/mymodule2.py

然后就可以直接导入了,而不需要再写路径:

>>> import mymodule2
>>> mymodule2.name
<function name at 0x1046d1c08>
>>> mymodule2.name()
'Python'

也就是,要将模块文件放到合适的位置——就是 sys.path 包括位置——就能够直接用 import 引入了。

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

推荐阅读更多精彩内容

  • 环境: 大部分在Python3.7下测试执行 import语句很长时该怎么书写 可以: 也可以: 但官方建议使用括...
    Ovie阅读 2,092评论 1 1
  • Python的模块 在python中,任何一个python文件都可以看作一个模块 不同包下有相同模块名并不会冲突,...
    cws阅读 233评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Pyth...
    一只写程序的猿阅读 3,981评论 0 3
  • 今天在看multprocessing部分,源码如下。 导入multiprocessing部分的时候发生错误: At...
    everfight阅读 1,012评论 0 0