在python用import或者from...import来导入相应的模块。

模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了。

这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块。

二、搜索路径

Python会在以下路径中搜索它想要寻找的模块:

1. 程序所在的文件夹

2. 标准库的安装路径

3. 操作系统环境变量PYTHONPATH所包含的路径

Python代码

importsys

print('================Python import mode==========================');

print('The command line arguments are:')

foriinsys.argv:

print(i)

print('\n The python path',sys.path)

fromsysimportargv,path# 导入特定的成员

print('================python from import===================================')

print('path:',path)# 因为已经导入path成员,所以此处引用时不需要加sys.path

如果你要使用所有sys模块使用的名字,你可以这样:

fromsysimport*

print('path:',path)

三、Python项目结构

所以在Python项目里面的区分,按照如下规定进行:

1.严格区分包和文件夹。包的定义就是包含__init__.py的文件夹。

如果没有__init__.py,那么就是普通的文件夹。

2.导入package。

在python 安装目录的site-package文件夹中新建xxx.pth,内容是需要导入的package所在的文件夹路径。

3.导入模块。

就是一般的模块导入写法,注意只要包路径,不要文件夹路径。

以上面工程为例,

总共有4个包,分别是:package,package1, package2,

folder2.(注意,folder1不是package,因为它没有__init__.py)。

这些包所在的文件夹共有两个,test以及test/folder1。 注意,package2所在的文件夹是test,虽然它是包含在folder2里面,但是folder2是一个包,不是一个文件夹。

因此在site-package中新建一个XXX.pth, 里面添加上test以及test/folder1的绝对路径即可。

模块导入比较简单,只要依次填包名就可以了,但注意只要包名

如果需要导入module2,则import folder2.package2.module2

如果需要导入module1,则import

package1.module1 注意,路径中没有folder1,因为folder1是文件夹,不是包。

———*———*————*————*———*———*分割线————*————*———*———*————*——

1如何使用import

对于大型的软件项目,模块化的管理非常有必要.

于是在现如今的面向对象语言中,都有相应的机制来应对这一问题.

如C++中的namespace, Java中的package,C#中的namespace和using.

import就是Python中用于程序模块化管理的关键字.

通过import语句,将模块中声明或定义的变量或者函数等名字在当前程序运行的时刻可见.

这样我们就可以直接通过名字的方式,如变量名或者函数名复用原有代码.

通过import语句,我们就能将python代码模块化,方便管理和维护

2import语句针对单个模块文件的工作方式

先看一组示例:

>>> path

Traceback (most recent call last):

File "", line 1, in

NameError: name 'path' is not defined

>>> sys.path

Traceback (most recent call last):

File "", line 1, in

NameError: name 'sys' is not defined

>>> import sys

>>> path

Traceback (most recent call last):

File "", line 1, in

NameError: name 'path' is not defined

>>> sys.path

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',

'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',

'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',

'/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10',

'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

>>> from sys import path

>>> path

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',

'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',

'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',

'/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10',

'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

这段代码中,我们尝试使用sys包中的path变量得到python默认查找模块的路径信息,只有在import

sys之后,python解释器才能正确的找到该变量.

我们通过一个python内部函数dir()来看看python解释器如何找到名字的.

dir()函数是python内建函数,用于查看指定作用域下可用的名字.

若没有传参数,则打印当前作用域下的可用名字.

>>> help(dir)

Help on built-in function dir in module __builtin__:

dir(...)

dir([object]) -> list of strings

If called without an argument, return the names in the current scope.

Else, return an alphabetized list of names comprising (some of) the attributes

of the given object, and of attributes reachable from it.

If the object supplies a method named __dir__, it will be used; otherwise

the default dir() logic is used and returns:

for a module object: the module's attributes. for a class object: its attributes, and recursively the attributes of its bases. for any other object: its attributes, its class's attributes, and

recursively the attributes of its class's base classes. >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> import sys >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'sys'] >>> dir(sys) [ ..., 'modules', 'path', ... , 'version', 'version_info', 'warnoptions'] >>> from sys import path >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'path', 'sys']

执行import语句后,python解释器会将sys模块的名字添加到当前作用域中,这样就能直接通过sys.path得到python的搜索路径了.

注意到,我们还用了from sys import

path语句.通过这条语句path就被直接提升到当前作用域中,这样path这个名字就能被直接使用了.

之所以有from,是为了更加精确的让某个模块中的某个名字在当前作用域可见.通过这种机制,程序员可以精确控制当前作用域的名字,防止作用域被不必要的名字污染.

另外,这种机制也避免了使用”.”来进行子成员的引用,减小程序员的输入.

这里需要提一句,虽然python提供了from XXX import

*支持,能将XXX模块中的所有名字都提升到当前作用域中,但是要小心使用,因为程序员不能精确的知道到底import了哪些名字.

再看一组示例:

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__']

>>> import sys

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'sys']

>>> import sys as SYS

>>> dir()

['SYS', '__builtins__', '__doc__', '__name__', '__package__', 'sys']

>>> SYS.path

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',

'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',

'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',

'/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10',

'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

>>> sys.path

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',

'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',

'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',

'/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10',

'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

>>> del(sys)

>>> SYS.path

['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',

'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',

'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',

'/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10',

'/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

>>> sys.path

Traceback (most recent call last):

File "", line 1, in

NameError: name 'sys' is not defined

上面的例子展示了两个功能:

import XXX as YYY:

这个可以对模块实施重命名操作.

del():

用于删除当前空间中不再使用的名字.当空间中出现很多不再需要的名字时,可以利用该函数进行清理.

3import语句针对模块包的工作方式

有时我们可能需要编写一个完整的模块库,比如python对XML的处理就需要一堆的函数.这时候可能划分成多个文件,更加方便管理.

逻辑上也更加清晰.

因此python引入了对多文件模块包的支持.说白了,就是import的不是一个文件的内容,而是一个文件夹的内容.

看下面的示例:

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__']

>>> import xml

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'xml']

>>> import xml.sax.xmlreader

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'xml']

>>> dir(xml)

['_MINIMUM_XMLPLUS_VERSION', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'sax']

>>> dir(xml.sax)

['ContentHandler', 'ErrorHandler', 'InputSource', 'SAXException', 'SAXNotRecognizedException', 'SAXNotSupportedException',

'SAXParseException', 'SAXReaderNotAvailable', '__builtins__', '__doc__', '__file__', '__name__',

'__package__', '__path__', '_create_parser', '_exceptions', '_false', '_key', 'default_parser_list', 'handler',

'make_parser', 'parse', 'parseString', 'xmlreader']

>>> from xml import *

>>> dir(xml)

['_MINIMUM_XMLPLUS_VERSION', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'dom', 'etree', 'parsers', 'sax']

表面上看起来,和内容在单个文件内的import机制差不多.

我们可以到xml对应的目录下看看:

erlv@erlv-debian:/usr/lib/python2.7/xml$ ls *

__init__.py __init__.pyc __init__.pyo

dom:

domreg.py expatbuilder.py __init__.py minicompat.py minidom.py NodeFilter.py pulldom.py xmlbuilder.py

etree:

cElementTree.py ElementInclude.py ElementPath.py ElementTree.py __init__.py

parsers:

expat.py __init__.py

sax:

_exceptions.py expatreader.py handler.py __init__.py saxutils.py xmlreader.py

我们import的xmlreader,它的路径是xml/sax/xmlreader.py,和import

xml.sax.xmlreader相同.

这实际上也正是python解释器实际的动作.

注意到,每个文件夹下都有一个_init__.py文件.这个是模块包中的必须文件,它帮助python解释器将该目录识别成包.

没有此文件的文件夹,python解释器不会把它当模块包文件夹的.

_init__.py中一般会指定包中所有的模块,以及import此包时,需要预先import哪些包等初始化信息.当然,你可以往里面添加其他代码.

该脚本会在import 包时执行. 默认可以为空.

另外,还注意到有.py,.pyc和.pyo三个文件.

.py文件:Python源程序文件,文本文件

.pyc文件:编译成字节码的python文件,可以使用python解释器,或者调用pycompile模块生成该文件.

.pyo文件:进行一定编译优化的后的字节码文件.

另外,还可以控制python解释器,去掉”docstrings”,即代码中的无关文档字符串.

4总结及深入阅读

从上面的观察中可以看到,其实python的import机制完成的是名字作用域的相关操作.包括作用域的分层,提升和删除等等.

Python中的作用域是一个树状的结构,通过”.”操作,程序员可以进入作用域分支中找到想要的名字.

同时,可以通过from XXX import YYY机制实现将某个树枝上的名字提升到当前作用域中.

所以,python解释器在实现这种作用域机制的时候,需要引入作用域层级的概念.

另外,为了实现这套机制的动态支持,包括提升新名字,名字重命名和名字删除操作.

Python解释器采取了全局模块池的方式.所有的模块在加载后都添加到这个池中.

在通过链表的形式维护树状的逻辑结构.

python中灵活的作用域管理,一方面可以让程序员更加方便的对代码进行模块化管理,另外一方面也增加了灵活性,最大可能的减小当前作用域的名字污染问题.

参考2中的中,详细介绍了python解释器中如何支持import动作的.

这部分的实现主要在cpython解释器的import.c文件中.import动作的入口函数是bltinmodule.c的builtin__import__函数.

5参考

可爱的Python 哲思社区著 电子工业出版社 2009.9

———*———*————*————*———*———*分割线————*————*———*———*————*——

在eclipse中用pydev开发python脚本时,我遇到了一个这样的现象,当我新建一个pydev

package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么,因为没有什么东西可写在这里,所以我直接把这个文件给删掉了,结果我的包图标自动变为文件夹图标了,这是怎么回事呢!

原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有

__init__.py

那么它就是这个包的子包了。当你将一个包作为模块导入(比如从xml 导入 dom )的时候,实际上导入了它的 __init__.py 文件。

一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

_init__.py

文件:

__init__.py 控制着包的导入行为。假如 __init__.py

为空,那么仅仅导入包是什么都做不了的。

>>> import Package1>>> Package1.Module1Traceback (most recent call last):

File "D:/Work Space/Python practice/MyPractice/src/test.py", line 8, in

aa=Package1.Module1

AttributeError: 'module' object has no attribute 'Module1'

我们需要在 __init__.py

里把 Module1 预先导入:

#文件 __init__.py import Module1

测试:

>>> import Package1 >>> aa=Package1.Module1 >>>print aa

__init__.py

中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:

from PackageName import *

这时 import 就会把注册在包

__init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:

#文件 __init__.py __all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]

测试:

>>>from Package1 import *>>>

test1111111111111111111111

test222222

__init__.py

文件会在导入时被执行。

python中from import*的*什么意思_[Python]Python中的import和from import相关推荐

  1. python import random 报错_导致python中import错误的原因是什么

    Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.Python本身也内置一组模块(即标准库).每个模块都是一个Python程序,且包含了一组相 ...

  2. python里面列表可以同时删除吗_在python中从列表中删除项,同时对其进行迭代

    本问题已经有最佳答案,请猛点这里访问. 我正在为锦标赛应用程序编写循环算法. 当玩家数量为奇数时,我将'DELETE'添加到玩家列表中,但稍后,当我想从包含'DELETE'的日程表列表中删除所有项目时 ...

  3. python字典的键有什么要求_在Python中使用范围作为字典键,我有什么选择?

    这是我的第一篇文章,我对编程很陌生,所以我可能无法恰当地传达我的问题,但我会尽我所能! tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourt ...

  4. python中main.py是什么意思_关于python:什么是__main__.py?

    __main__.py文件是用来做什么的,我应该把什么类型的代码放进去,什么时候应该有一个? 通常,通过在命令行中命名.py文件来运行python程序: $ python my_program.py ...

  5. python中texttable库显示实时数据_用Python串口实时显示数据并绘图pyqtgraph

    用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...

  6. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  7. python显示3位数不够0补位_关于Python开发中的那些坑总结,令人防不胜防,建议收藏!...

    在学习 Python 的过程中,我为它的简洁优雅而痴迷,但它又是如此的调皮,在提供了很多舒服的功能特性之外,又悄悄挖了很多带有迷惑性的坑,令人防不胜防- 人不能两次踏入同一条河流,在无数次踩进同样的坑 ...

  8. python 删除字典中的键和值del()_从OrderedDict中删除键和值 - python

    我正在尝试从OrderedDict中删除键和值,但是当我使用时: dictionary.popitem(key) 即使提供了其他键,它也会删除最后一个键和值.如果使用字典,是否可以删除中间的键? 参考 ...

  9. python中导入模块使用哪个关键字_关于python导入模块的关键字介绍

    关于python导入模块的关键字介绍 发布时间:2020-04-17 10:13:26 来源:亿速云 阅读:101 作者:小新 今天小编给大家分享的是关于python导入模块的关键字介绍,很多人都不太 ...

  10. python安装后找不到目录_将python setup.py安装到其他路径中找不到已安装的packag

    我有一个测试设置文件,它是我为一个简单的"hello world"脚本创建的.我有一个名为mytest的包,它有一个函数hello.现在,我有一个非常简单的setup.py.如果我 ...

最新文章

  1. python时间函数入门_calendar在python3时间中有哪些常用函数?怎么用?
  2. python使用imbalanced-learn的OneSidedSelection方法进行下采样处理数据不平衡问题
  3. 找ipcore的地方
  4. 谈谈对Canal( 增量数据订阅与消费 )的理解
  5. 计算机文件共享访问无权限,WIN7访问共享文件无权限解决方法
  6. 小程序微信授权登录服务器异常,解决调试腾讯云微信小程序Demo错误“登录失败:调用鉴权服务失败#40029_WEIXIN_CODE_ERR”...
  7. 泛型的基本用法和代码演示
  8. ucenter 显示通信成功的条件
  9. Pandas to_numeric
  10. Google 作恶!99.9% 的 Android 手机 App 都在窃取隐私
  11. 谷歌跟风推微信小程序;中兴解禁后首获订单;Yahoo Messenger正式关闭 | 极客头条...
  12. vivado中交织模块_Adalm Pluto SDR主动学习模块让您拥有完善的无线电RF射频实验室...
  13. border 0px和border none的区别
  14. 工作流入门比较经典的文献
  15. 有备无患:避免文件丢失的可行方案
  16. centos7 小图标_Centos7 桌面图标设置
  17. IE8.0的发展历程之一
  18. WINVNC(二)omni_thread
  19. #今日论文推荐# 阿里达摩院最新FEDformer,长程时序预测全面超越SOTA | ICML 2022
  20. 一个屌丝程序员的青春(三六六)

热门文章

  1. 华为云图引擎服务GES-实时推荐算法
  2. 广义表和二叉树的转换
  3. 小福利,用Excel VBA设计一个查询小应用
  4. asm 编写 wasm 对比原生性能
  5. 怎样让git不用每次输入密码_请问如何解决git pull/push每次都要输入密码的问题?...
  6. 增删改查接口命名规范
  7. 四、计算机网络之网络层
  8. 手把手教你在centos上配置Django项目(超详细步骤)
  9. 小白学Django第十天| 模板的知识全部给你总结好了!
  10. CPU是计算机的大脑英语,走进PC的大脑:CPU知识全面剖析