Python包和模块的导入问题

模块——代码封装 
模块是Python组织代码的基本方式。Python的脚本都是用扩展名为py的文本文件保存,一个脚本可以单独运行,也可以导入另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module)。就是说,我们在python里写的所有代码文件都可以叫模块。 
导入的时候,模块名与脚本的文件名相同,例如我们编写了一个名为items.py 的脚本,则在另外一个脚本中用import item语句来导入它。 
windows环境下在python中查看安装有哪些模块

>>> import sys >>> sys.modules #windows环境下,导入模块方式: >>> import os >>> os.getcwd() ‘D:\\Python33‘ >>> os.chdir (‘F:\eclipse\workspace\learn\extend‘) >>> os.getcwd() ‘F:\\eclipse\\workspace\\learn\\extend‘ >>> import calculator 0.5 #首先定位python的工作目录os.getcwd() #然后改为当前工作目录os.chdir (‘F:\eclipse\workspace\learn\extend‘) #在F:\eclipse\workspace\learn\extend这个目录下有一个之前写好的计算器文件名为calculator.py #直接导入用import calculator就可以得出结果了。 #如果我导入上节课做的fibonacci螺旋递归代码 #那么一样进入用户交互 >>> import fibonacci3 请输入Fibonacci螺旋层数:8 注意:两个数字不能同时为0! 第一个数字2.6 第二个数字-2.12 2.60 -2.12 0.48 -1.64 -1.16 -2.80 -3.96 -6.76 >>>

那么在编辑器里这样写

print(‘这是在运行导入的模块‘) import fibonacci3 #运行结果:  这是在运行导入的模块 请输入Fibonacci螺旋层数:6 注意:两个数字不能同时为0! 第一个数字2.2 第二个数字0.95 2.20 0.95 3.15 4.10 7.25 11.35
print(‘这是在运行导入的模块‘) import calculator3 #运行结果:  这是在运行导入的模块 1.5

那么看看calculator3.py的源代码:

from __future__ import division def f(x,o,y): print({‘+‘ : x+y, ‘-‘ : x-y,‘*‘ : x*y, ‘/‘ : x/y}.get(o)) f(3,‘/‘,2)

里面已经做了一个运算,所以import的时候直接是输出结果。如果我们把运算去掉也就是剩下这段代码

from __future__ import division def f(x,o,y): print({‘+‘ : x+y, ‘-‘ : x-y,‘*‘ : x*y, ‘/‘ : x/y}.get(o))

那么我们再次导入这个模块的时候是只剩下函数,需要额外调用。调用方法为(新建一个mol.py文件):

print(‘这是在运行导入的模块‘) import calculator3 calculator3.f(3, ‘/‘, 2) #注意,调用模块函数的方法是 模块名.函数名(参数值) #运行结果  这是在运行导入的模块 1.5

这里有个问题,如果我的模块里包含了函数赋值计算,如:

from __future__ import division def f(x,o,y): print({‘+‘ : x+y, ‘-‘ : x-y,‘*‘ : x*y, ‘/‘ : x/y}.get(o)) f(3,‘*‘,2)

那么我再次运行mol.py文件时会出现两个结果:

这是在运行导入的模块 6 1.5

第一个结果 6 是模块自身的运算结果,第二个1.5是在mol.py里调用模块函数的运算结果。 
在实际应用中,有两种情况考虑。 
第一是直接执行模块文件的话,里面的运算是需要执行的。 
第二是如果是被别人所调用的话,那么模块里的运算程序是不需要执行的 
解决方法需要借助一个内置属性,现在在calculator3.py里加一行:

from __future__ import division def f(x,o,y): print({‘+‘ : x+y, ‘-‘ : x-y,‘*‘ : x*y, ‘/‘ : x/y}.get(o)) print(__name__) #这个__name__就是内置函数,__name__的值会随着调用的对象不同而变化 #如果我们直接运行: __main__ #这是这个文件的对象名,大概意思是指我们现在调用的是主体程序(按着教程猜的) #我们在mol.py里调用 print(‘这是在运行导入的模块‘) import calculator3 calculator3.f(3, ‘/‘, 2) #运行结果:  这是在运行导入的模块 calculator3 #这里__name__的值变成了文件名

1.5

因此,可以在calculator3.py里加一个判断,当__name__ ==__main__的时候执行源文件的运算程序, 
否则运行模块调用的函数赋值运算。

from __future__ import division def f(x,o,y): print({‘+‘ : x+y, ‘-‘ : x-y,‘*‘ : x*y, ‘/‘ : x/y}.get(o)) if __name__ == ‘__main__‘: f(3,‘*‘,2) #那么直接运行calculator3.py的时候会做 f(3,‘*‘,2) 的运算,而在mol.py里运行则不会运算: print(‘这是在运行导入的模块‘) import calculator3 calculator3.f(3, ‘/‘, 2) #运行结果: 这是在运行导入的模块 1.5

导入模块的时候有顺序限制,一般先从当前目录下查找模块文件,然后再从内置模块中查找 
这句怎么理解? 
string模块是内置模块,如果我在当前目录新建了一个叫string.py的文件,导入之后如果想使用string内置函数的话,那么程序会先在目录下查找string这个模块,这里新建的string.py会被导入,执行string内置函数的话就会出错。因此要使用string模块的话必须把新建的那个string.py文件删除,同时还得删除刚才导入时生成的一个叫string.pyc的文件。才能正确使用string这个内置模块

包 
Python的模块可以按目录组织为包 
创建一个包的步骤是: 
1.建立一个名字为包名字的文件夹, 
2.在该文件夹下创建一个__init__.py文件, 
3.根据需要在该文件夹下存放脚本文件、已编译扩展及子包 
4. import pack.m1, pack.m2, pack.m3

示范:新建一个pack.py文件,假如我们要想重复使用calculator3.py里的函数运算,那么可以在calculator3.py所在目录下新建一个文件夹,假如命名为bag,在bag文件夹里新建一个__init__.py文件(必须有),内容可以为空,把需要导入的calculator3.py文件复制进去。那么这个bag文件夹就可以称之为python包。注意,调用模块的py文件不能在包里,如这里新建的pack.py不能放在bag里,否则会报错。 
文件结构如图: 

print(‘这是在运行导入的python包‘) import bag.calculator3 #注意格式,包名字.模块名 bag.calculator3.f(3, ‘/‘, 2) #调用函数时候 包名字.模块名.函数名(参数值) #运行结果: 这是在运行导入的python包 1.5

小结: 
模块导入有import,import as,from import等几种方法。具体区别参考: 
http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html

时间: 2025-01-01 23:22:30

Python包和模块的导入问题的相关文章

关于python包,模块,.pyc文件和文件导入理解

参考文献 一.包 包是一个文件夹,用来存放模块和子包. 包里一般会有一个__init__.py的文件(也可以没有). 包里会有一个__pycache__文件夹,存放.py文件经解释器解释后的中间字节码(二进制文件). 二.模块 可以作为模块的文件有.py..pyc..pyo..pyd..so..dll文件. 三..pyc文件与.pyo文件 这两个文件都是二进制文件,由python解释器将.py文件转化成的二进制文件,目的是加快解释速度且可以隐藏源代码. python解释器在解释.py文件时,会优

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十课(包、模块 的导入)

$ pip3 install tensorflow : 第三方模块 tensorflow 的安装 电脑必须有网 命令行自动下载安装dir(模块名): 查看模块所有属性 自定义模块导入 示例: 自定义模块的实现方法 def myfac(n): print('正在计算', n, '的阶乘') def mysum(n): print("正在计算1+2+3+...+%d的和" % n) name1 = "Audi" name2 = "TESLA" pri

python包、模块

在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包.模块.类.类这个就不用说了. 模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,py 文件中可以直接定义一些变量.函数.类. 那么包我们可以看作一个包含__init__.py 和一系列.py 文件的文件夹,这样做的目的是为了区别包和普通字符串. import module_name from package_name import module_name from package

python包与模块

Python基础-包与模块 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含__init__.py文件). 模块搜索路径,Python解释器在特定的目录中搜索模块,运行时sys.path即搜索路径. 使用import关键字导入模块,注意 import *与__all__的关系. 1. 模块与导入 A module is a file containing Python definitions and statements

python基础四(模块的导入)

一.导入模块?从模块导入时,一般使用 import sys(用sys模块举例) #这种方式导入模块,要使用这个模块其中的功能,语法为模块名称**.**功能,如print(sys.path) from sys import path #这种方式导入模块要使用模块中的功能,直接功能名即可print(sys),如果要导入该模块多个功能可以以逗号隔开 from SomeMode import * #这种方式和第二种一样只是把具体的功能名换成了*(导入所有),这种方式也有弊端,假如你导入的模块都有一个名为

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十一课(包、模块 的导入)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 补充:包的相对导入 只对后两种导入方式有用 包的相对导入 只对后两种导入方式有用 异常(基础)except: 什么是错误: 是指由于逻辑或语法等导程序无法正常执行的问题 什么是异常: 是程序出错的标识符的一种状态 当异常发时 程序不会再向下执行,而转去调用此函数的地方 待处理此错误并恢复为正常状态 异常的作用: 用作信号, 通知上层调用者有错误产生需要处理try 语句: 两种语

python包与模块导入

一 .module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".".pyd".".so".".dll". 二. package 通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块.包目录下为首的一个文件便是 __init__.py.然后是一些模块文件和子目录,

python 包与模块

1. 打印Python当前模块的搜索路径 import sys print (sys.path) ['D:\\work_bonc\\Python_WorkSpace\\deep learning\\TF', 'D:\\work_bonc\\Python_WorkSpace', 'C:\\Python35-64\\python35.zip', 'C:\\Python35-64\\DLLs', 'C:\\Python35-64\\lib', 'C:\\Python35-64', 'C:\\Pytho

(转)Python中的模块循环导入问题

本文转自: https://wiki.woodpecker.org.cn/moin/MiscItems/2008-11-25 问题 cleven <[email protected]> 回覆至 [email protected] 收件人 [email protected] 日期 2008年11月25日 下午 12:01 主旨 [CPyUG:72341] import嵌套的问题 看了<Python源码剖析>,里面提到的嵌套import的问题还是没有弄明白,各位给看一下吧. [A.py