`
rockis
  • 浏览: 19205 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python的import过程

阅读更多
1. import的过程
假设在/tmp/test下有个testmodule.py文件,文件内容如下:
value = 'hello world'

在控制台执行下面的命令:
[user@host]$ export PYTHONPATH=$PYTHONPATH:/tmp/test
[user@host]$ python
>>> import testmodule
>>> print testmodule.value

这时我们就会看到屏幕上会输出"Hello World"字样

这个过程中python究竟干了些什么呢?以下是我的猜测
首先查找sys.modules,判断testmodule是否已经被加载。如果已经被加载,则使用已经加载过的testmodule
如果没有加载过,则在sys.path下查找,找到后创建testmodule对象,并把创建后的testmodule保存在sys.modules变量中。

下面做两个小实验:

实验1:
>>> import sys
>>> sys.modules.has_key('testmodule')
False
>>> import testmodule
>>> sys.modules.has_key('testmodule')
True

上面的实验验证了,python会把加载过的module放在sys.modules变量中

实验2
>>> import os
>>> import testmodule
>>> testmodule.value
'hello world'
>>> os.system("echo 'value=0' > /tmp/test/testmodule.py") #将testmodule.py中的代码改为"value = 0"
>>> import sys
>>> del sys.modules['testmodule']
>>> import testmodule
>>> print testmodule.value
0

这时我们发现第二次打印的testmodule.value,值就变成了0。这个实验说明,如果在sys.modules中找不到module,则会重新加载。

实验3:
>>> import sys
>>> import types
>>> module = types.ModuleType('testmodule')
>>> sys.modules['testmodule'] = module
>>> module.value = 'hello python'
>>> import testmodule
>>> testmodule.value
'hello python'
>>>

实验3表明了,即使在PYTHONPATH下不存在的module,只要在sys.modules中能够找到,也能import。


了解了python的import的方式,我们就可以实现下面这些功能:
1.在运行期设置pythonpath
2.动态创建python代码并执行之
3.动态创建module
4.在运行期将一个module移动到另外一个包下
等等
分享到:
评论
1 楼 ph4nut 2010-01-27  
>>> import sys   
>>> import types   
>>> module = types.ModuleType('testmodule')   
>>> sys.modules['testmodule'] = module   
>>> module.value = 'hello python'  
>>> import testmodule   
>>> testmodule.value     #属性不更新
'hello python'  
>>> reload(testmodule)
>>> testmodule.value     #更新属性 
'Hello World'


从例子可以看出,import和reload的区别:
〔1〕 import一个module后,如果此module已经在sys.modules里有一个实例,那么不会更新这个实例的重名属性的值
〔2〕 在相同的情况下,reload(要先import同一个module,才能reload)则会更新重名属性的值

相关推荐

    Python-isort对Pythonpackage的import顺序进行排序

    在Python编程中,保持...总的来说,`isort`是Python开发中的一个强大工具,它能够帮助开发者遵守编程规范,提高代码质量,并简化代码审查的过程。通过学习和应用`isort`,我们可以更好地管理和维护我们的Python项目。

    Python库 | mypy-boto3-importexport-1.18.35.tar.gz

    `mypy-boto3-importexport`库则为这一过程提供了Python化的接口。 使用`mypy-boto3-importexport`,开发者可以轻松创建和管理导入作业,监控作业状态,以及处理导出作业。这个库的API设计遵循Python的惯用法,使得...

    python调试文件时发生import requests报错.doc

    Python 调试文件时发生 Import Requests 报错解决方法 在 Python 调试文件时,如果碰到 Import Requests 报错,可能是因为 Python 环境中没有安装 Requests 库所致。解决这个问题需要完成 pip 安装过程,下面是详细...

    详解Python中import机制

    <module 'module_name' from 'E:\\PythonImport\\module_name.py'> ``` 可以看到,`module_name`被成功导入,并且打印出了模块的类型和路径。 #### 七、总结 通过本文的介绍,我们可以看到Python中的`import`机制...

    python3 解决cannot import name '_AES'问题

    在Python编程环境中,有时我们可能会遇到“cannot import name '_AES'”这样的错误,尤其是在尝试导入`Crypto.Cipher.AES`模块时。这个问题通常出现在使用了`pycryptodome`库或者`pycrypto`库尝试进行AES加密解密...

    python引用(import)某个模块提示没找到对应模块的解决方法

    在Python开发过程中,经常会遇到导入模块时出现“找不到对应模块”的错误。这种情况通常是因为Python解释器无法在系统路径中找到指定模块的位置。本文将详细介绍可能导致此问题的原因及相应的解决策略。 #### 一、...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    python学习基础之循环import及import过程

    python中的import语句是用来导入模块的,下面这篇文章主要给大家介绍了关于python学习基础之循环import及import过程的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

    Python库 | import_resolve-0.1.2.tar.gz

    `import_resolve-0.1.2.tar.gz` 是一个Python库的压缩包,其版本为0.1.2。这个库可能包含了用于解决模块导入问题的特定功能,特别是在处理复杂的依赖关系或者优化代码导入流程时可能会用到。 Python的`import`机制...

    python3 报错cannot import name '_AES'

    在Python编程环境中,有时我们可能会遇到“cannot import name '_AES'”这样的错误,尤其是在尝试使用像`Crypto.Cipher.AES`这样的加密库时。这个错误通常意味着Python无法找到 `_AES` 这个内部模块或者动态链接库...

    code_python故障诊断_python故障_fault_故障诊断_python_

    在Python编程过程中,故障诊断是不可或缺的一个环节,它关乎到代码的健壮性和问题的快速定位。本资源集合提供了一些基于Python的故障诊断程序,旨在帮助故障诊断学者深入理解和实践这一领域。以下将详细探讨Python...

    Python库 | mds_import_product-4.6.2.tar.gz

    1. `setup.py`: 这是一个Python脚本,用于定义库的元数据(如名称、版本、作者等)以及安装配置,通常使用setuptools或distutils库来执行安装过程。 2. `README`: 通常提供库的基本介绍、使用方法和安装指南。 3. `...

    powerbuilder使用python程序导入excel文件

    本话题将详细介绍如何利用Python将Excel文件转换为带制表符的TXT文本,并在PowerBuilder中调用这个过程。 首先,我们需要了解如何使用Python读取和处理Excel文件。Python的`pandas`库提供了便捷的方式来处理Excel...

    python专用boost扩展模块/boost_python-1.55.win32-py3.3.rar

    这个过程会将所需的动态链接库(DLLs)和相关文件安装到Python的site-packages目录下,以便Python能够找到并加载Boost扩展。 使用Boost Python时,首先需要在Python代码中导入`boost.python` 模块。例如: ```...

    Python加载ASAP软件multiresolutionimageinterface问题.docx

    import multiresolutionimageinterface ``` 如果没有报错,则表示模块加载成功。 #### 三、常见问题及解决方案 ##### 3.1 版本不匹配 - **问题描述**:如果ASAP版本与Python版本不匹配,可能会导致加载失败。 -...

    Python 从相对路径下import的方法

    在Python编程过程中,经常需要从其他模块导入功能或类,这通常通过`import`语句实现。当涉及到不同目录层级下的模块时,使用相对路径进行导入变得尤为重要。本文将详细介绍如何在Python中从相对路径下进行模块导入,...

    SPSS中python如何应用教程

    在实际操作过程中,用户可以通过编写Python脚本来自动化SPSS的分析任务。例如,可以使用Python来读取数据集,创建新的输出文档,运行语法,保存服务器配置,以及进行其它的各种操作。而通过ScriptParameter方法,...

    Python中import导入不同目录的模块方法详解

    ### Python中import导入不同目录的模块方法详解 在Python编程中,经常需要使用`import`语句来导入其他模块或包。本文将详细介绍如何在不同的目录层级之间进行模块的导入,包括同级目录、子目录、父目录以及兄弟目录...

    python豆瓣电影爬虫

    在这个过程中,需要注意反爬策略,如设置User-Agent,延时请求等,以避免被网站封禁。同时,爬虫项目应遵循网站的robots.txt规则,尊重网站的版权和用户隐私。 总结来说,这个Python豆瓣电影爬虫项目涵盖了网络爬虫...

Global site tag (gtag.js) - Google Analytics