Python import 【总结】

Python import总结

1     前言

可能网上很多文章或博客都没解释清楚,作者自己也苦心于Python的import。至此,把自己的总结的分享给大家,本文不做基础讲解,仅说明疑惑的地方。

新版本的Pycharm 2017.1.1,对自己定义的模块都有提示,写代码的提示(如方法,变量)。

2     目录

3     本质

import的本质,针对包和模块来说,对于版本Python2和Python3来说,意义一样的,仅拿Python2做实验说明,Python3不做赘述。Python2版本Python2.7.13,Python3版本Python3.6.1.

3.1   模块

导入模块的本质是把python文件解释和执行一遍。

test.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

print("I am test module.")

下面在同级目录TestImport.py中导入该模块:

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import test

执行命令:

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

I am test module.

3.2   包

导入包的本质是执行包下的__init__.py文件。

dir1/__init__.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

print("I am dir1package.")

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import dir1

执行命令:

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

I am dir1 package.

4     说明

4.1   导入模块

普通导入import test,模块下的全部对象全部导入,这里不做说明;下面是对模块进行对象的限制导入说明。

test.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

__all__=["A","printInfo"]

A = "Python"

B = "Java"

C = "Php"

def printInfo():

print("I am test module.")

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import test

# from test import *

print(test.A)

print(test.B)

print(test.C)

test.printInfo()

执行python:

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

Python

Java

Php

I am test module.

发现所有对象都导入了。

使用from x import *导入:

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

# import test

from test import *

print(A)

print(B)

print(C)

printInfo()

执行命令:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

Python

Traceback (most recent call last):

File"C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py",line 10, in <module>

print(B)

NameError: name ‘B‘ is not defined

注释掉__all__中没有的对象,如下:

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

# import test

from test import *

print(A)

# print(B)

# print(C)

printInfo()

执行命令:

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

Python

I am test module.

总结:模块中__all__对对象的限制,仅对fromimport有效,对import无效

4.2   Python2

4.2.1   导入包

在__init__.py文件中,直接import该包下的模块。

导入dir1包:

dir1/__init__.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

‘‘‘

1.这个文件在导入包时,确实会被执行;

‘‘‘

import test11

import test12

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import dir1

dir1.test11.printInfo()

dir1.test12.printInfo()

执行命令:

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

I am test11.

I am test12.

在__init__.py文件中,定义__all__导入:

导入dir1包:

dir1/__init__.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

‘‘‘

1.这个文件在导入包时,确实会被执行;

‘‘‘

__all__=["test11","test12"]

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

from dir1 import *

test11.printInfo()

test12.printInfo()

执行命令:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

I am test11.

I am test12.

Python2中用from package import*可导入package下__init__.py文件限制的模块。将解释器切换至Python3,发现也可正常执行。

在__init__.py文件中,使用相对路径导入:

dir1/__init__.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

‘‘‘

1.这个文件在导入包时,确实会被执行;

‘‘‘

from . import test11

from . import test12

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import dir1

# from dir1 import *

dir1.test11.printInfo()

dir1.test12.printInfo()

或者

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

# import dir1

from dir1 import *

test11.printInfo()

test12.printInfo()

上述Python都能正常运行在Python2中,切换python解释器3,发现也能正常运行。

4.3   Python3

导入dir1包:

dir1/__init__.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

‘‘‘

1.这个文件在导入包时,确实会被执行;

‘‘‘

import test11

import test12

TestImport.py文件如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import os,sys

import dir1

dir1.test11.printInfo()

dir1.test12.printInfo()

执行命令:

C:\Python36\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

Traceback (most recent call last):

File"C:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py",line 6, in <module>

import dir1

File"C:\Users\Administrator\PycharmProjects\Foundation\FuckImp\dir1\__init__.py",line 8, in <module>

importtest11

ModuleNotFoundError: No module named ‘test11‘

总结:包中__init__.py文件中直接importmodule,调用该包时,Python2中能正常运行,Python3中却异常报错。

5     总结

  1. 针对模块导入,模块中可采取__all__限制from moduleimport *导入的对象,模块的导入Python2和Python3并没有差异,都不会抛出异常;
  2. 针对的导入,Python2中包下__init__文件可直接import对应包下的模块,Python3不能这样导入,需使用相对路径导入(from . import module),而相对路径导入的方法对Python2和Python3都有效;
  3. 针对的导入,Python2中包下__init__文件中使用__all__限制frompackage import *对象时,对Python2和Python3都有效;
  4. 针对从包来导包的导入,例如本例。

下面是dir1下的__init__文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: Changhua Gong
‘‘‘
1.
这个文件在导入包时,确实会被执行;
‘‘‘

from . import test11
from . import test12

交互式环境

C:\Users\Administrator\PycharmProjects\Foundation>python  顶级目录

>>> from FuckImp import dir1

>>> dir1.test11.printInfo()  # 加上包名就可调用了

I am test11.

在python项目中

TestImp.py如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

from FuckImp import dir1

dir1.test11.printInfo()# 加上包名就可调用了

运行

C:\Python27\python.exeC:/Users/Administrator/PycharmProjects/Foundation/FuckImp/TestImport.py

I am test11.

Python2和Python3一样有效

  1. 当import后是package或module时,调用对应的对象时,需加上pkg.module.object或module.object, 如from x import *,可直接调用x下的对象。
时间: 2024-10-27 04:27:55

Python import 【总结】的相关文章

python import 搜索路径 路径设置 pythonpath 库

python import 导入概述 在一个导入语句中的模块名起到两个作用:识别加载的外部文档,也会变成赋值给被载入模块的变量,模块定义的对象也会在执行时创建,就是在Import执行时,import会一次运行在目标文档中的语句从而建立其中的内容 程序第一次导入指定文件文件时执行的步骤: 找到模块文件 编译成位码(如果需要) 执行模块的代码来创建其所定义的对象 这三个步骤只在程序执行时, 模块第一次导入时才会进行,在这之后导入相同模块时,会跳过这三个步骤,而只是提取内存中已加载的模块对象 impo

python import 与 from .... import ...区别

在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候, 直接把相应的模块导入到我们的程序中,我们就可以使用了. pycharm 工具 #!/bin/python # filename:test.py import time; print time.ctime() time.sleep(5) print time.ctime() 打印: C:\Python27\python.exe C:

python import this

>>> import thisThe Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability cou

python import 自己写的模块

在使用python 的 import 时,可能会发生 "TypeError: 'module' object is not callable" 这个信息是说你试图把这个模块作为一个函数来调用,但它却无法调用. 一个模块里有a,b两个函数, 要调用函数a,必须先调用整个模块,再调用函数a 举个例子:

python import 自己的包

在写python时,有时候写的一个python文件可能需要被其他python文件所用,那么可以用导入包 import 的 方式: 1.自己写的包放到哪里? >>> import sys >>> sys.path ['', '/usr/lib64/python34.zip', '/usr/lib64/python3.4', '/usr/lib64/python3.4/plat-linux', '/usr/lib64/python3.4/lib-dynload', '/us

Python import 自定义模块

1.如果导入的模块和主程序在同个目录下,直接import就行了 2.如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器能将子目录其他.py文件当成一个模块,然后直接通过"import 子目录.模块"导入即可. 比如: import sub.test                    #sub为子目录,test为模块名 sub.test.function()                #调用模块函数 3

Python import 模块导入问题

最近在用Python做决策树(Decision tree)时, 遇见了一个以前没有遇到的问题,就是用'import sklearn.tree'时一切正常,但是'import sklearn..... sklearn.tree'时却报错说: AttributeError: 'module' object has no attribute 'tree'. python的导入机制是这样的,在用 'import sklearn' 时,它只会导入 \${sklearn_dir}/__init__.py 里

python import 和 from.........import 模块加载和作用域

import导入:如import moduleName 变量名moduleNmae有两个目的:识别要被载入的外部文件同时生成脚本中的变量,在文件加载后,用来引用模块对象:因为import使一个变量名引用整个模块对象,我们必须通过模块名称来得到该模块的属性 from语句: from会把模块内的变量名赋值到另一个作用域(把模块中的变量名并且在from字句中选择的复制到了进行导入的作用域之内),所以它就可以让我们直接在脚本中使用复制后的变量而不用通过模块 默认情况下,Python只对每个文件的每个进程

多版本python import 问题解决方案

原文http://www.tuicool.com/articles/EnE7nm6 多版本Python共存[支持使用pip安装包] 有时特殊需要会要用到高版本的Python, 但是系统自带的版本又是很多其他工具依赖的, 不能随意更新. 所以就会考虑安装另一个版本的python环境, 然后需要用到这个版本时就在脚本头部指明 #/usr/bin/env python2.7 这样. ## 下载要安装的 Python版本源码包(我用的是 2.7 版本) wget 'http://www.python.o