Python的模块引入

环境:

大部分在Python3.7下测试执行

import语句很长时该怎么书写

可以:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

也可以:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

但官方建议使用括号:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

模块查找顺序

  1. 先搜索内置模块(built-in module,内置在python编译器),如winreg模块(或叫_winreg模块,只在Windows下存在)
  2. sys.path(list类型)指定的一个个目录里搜索。

关于sys.path

执行python script.py时,sys.path的第一个元素是script.py文件所在的目录;如果不指定脚本文件,如;直接执行python进入交互模式,或执行python -m expectd.package.module等,sys.path的第一个元素就是空字符串,代表执行python命令时所在的目录。

sys.path还包括PYTHONPATH环境变量指定的目录,和安装时指定的默认值(The installation-dependent default)

绝对引入

一个目录结构为:

package/
    __init__.py
    string.py
    test.py

test.py里写import string,然后在package/目录的上一层目录(以让python找到我们自己写的package的位置)执行python -m package.test,那import的是同目录下的string模块,还是python自带的string模块呢?

在Python2.7下测试,是引入同目录下的string模块,因为import string语句会先查找同目录下的模块。这样的引入方式,无法在不重命名package/string.py文件的情况下导入python自带的string模块。所以Python加了一个绝对引入(absolute import),且在python3中默认使用,而在Python 2中使用绝对引入,需要在文件头写:from __future__ import absolute_import

绝对引入是指import时,都是从sys.path指定的目录下查找包或模块。如:import foofrom foo import bar。有了绝对引入,那要引入同目录下的模块,需要加上.符号,这叫相对引入(relative import, 相对于当前模块来引入)。如:from .foo import bar。而要引入上一层的模块,就用两个点,要引入上上一层就用三个点,如:from ..foo import bar引入上一层的模块。另外,要引入上一层的模块时,不可以写成import ..foo,而是写成from .. import foo

所以上面在python3测试,是引入python自带的string模块,若要引入同目录下的string模块,就写成from . import string

__init__.py文件

在目录下有__init__.py文件,Python才会把该目录看作包(package),在该文件中可以写初始化代码(引入包或包里模块等时会执行__init__.py),也可以设置__all__变量。

一个包的目录结构为:

package/
    __init__.py
    moduleX.py
    moduleY.py

如果__init__.py文件的__all__变量没设置,执行from package import *import package并不会引入package下的子模块或子包,而仅仅是引入该包(一般会执行__init__.py的代码)。需要这样写from package import moduleX, moduleY,就可以引入模块。

如果__init__.py文件里写__all__ = ['moduleX', 'moduleY'],执行from package import *就会引入__all__里的模块或子包,也就是会在当前域中存在moduleXmoduleY变量。

python script

有些时候并不是要写一个模块供调用,而是写几个脚本来执行。

目录结构为:

my_scripts/
    sub/
        __init__.py
        fibo.py
    helper.py
    test.py

(因为要在test.py文件中引入sub/fibo.py,需要告诉Python sub目录是个包,所以要放置__init__.py文件)

test.py里引入

import helper
from sub import fibo

然后在my_scripts/目录下执行python test.py。可以引入,没有报错。这是为什么?

像上面说的,sys.path的第一个元素是test.py所在的目录,所以上面两个绝对引入是可以找得到helperfibo的。

python -m命令

模块除了被import,也可以直接用python -m命令把模块当脚本来执行。如:python -m json.tool执行json包里的tool模块,用来格式化JSON数据。还有python -m pdb script.pypython -m profile script.py等。

python -m命令,实际上是调用runpy模块的runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)方法,其会搜索模块,依据加载的包、模块名来设置__package__属性等,以便让相对引入正确执行。例如执行python -m json.tool时,__name__设置成json.tool__package__设置成"json.tool".rpartition('.')[0],即json

参考链接

其它

from fibo import *

fibo是个模块,该import会导入fibo模块下所有变量,除了以_开头的变量。

dir()不会列出内置函数和内置变量,如果想要获取内置函数和内置变量,使用import builtins; dir(builtins)

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

推荐阅读更多精彩内容