python2和python3 通过import导入模块和包的区别

python2默认是按照相对路径导入模块和包,python3默认则是按照绝对路径导入

示例:
假设项目目录结构如下

A
|---test.py
|---A1
	|---__init__.py
	|---a1.py

test.py内容如下

import A1
A1.a1.foo()

a1.py内容如下

def foo():
	pass
  • 若用python2跑test.py,在A1的__init__.py中写import a1即可,这样test.py执行到import A1时会默认在A1的__init__.py的当前路径下执行__init__.py文件。

  • 但用python3跑test.py时,如果A1的__init__.py还是写成原来那样,解释器就会报错:

    ModuleNotFoundError:No module named 'a1'
    

    原因就是python3是按照程序运行的绝对路径(也即test.py所在的路径)导入模块和包的。test.py执行到import A1时会默认在test.py的路径下执行A1的__init__.py文件,该路径下显然没有a1模块。要想成功导入,需在__init__.py文件中写from . import a1。其中,.表示被执行的文件所在的当前路径。

在使用python3运行用python2写的一些项目代码时,需要留意这一点。

参考资料:
关于python3和python2 import的区别

Python 中,导入模块有多种语法,以下是一些常见的方式: ### 导入整个模块 使用 `import` 语句可以导入整个模块,之后通过模块名来访问其中的属性方法。 ```python import math result = math.sqrt(16) print(result) ``` ### 导入模块并取别名 为了简化代码或者避免命名冲突,可以在导入模块时为其指定一个别名。 ```python import math as m result = m.sqrt(25) print(result) ``` ### 从模块导入特定的属性或方法 使用 `from ... import ...` 语句可以从模块导入特定的属性或方法,这样在使用时就不需要通过模块名来引用。 ```python from math import sqrt result = sqrt(36) print(result) ``` ### 从模块导入多个特定的属性或方法 可以在 `from ... import ...` 语句中指定多个属性或方法,用逗号分隔。 ```python from math import sqrt, pi area = pi * sqrt(4) ** 2 print(area) ``` ### 从模块导入所有属性方法 使用 `from ... import *` 语句可以导入模块中的所有属性方法,但这种方式不推荐,因为可能会导致命名冲突。 ```python from math import * result = sqrt(49) print(result) ``` ### 导入中的模块 如果要导入中的模块,可以使用点号来指定模块的层次结构。 ```python # 假设 mypackage 是一个,module1 是其中的一个模块 import mypackage.module1 mypackage.module1.some_function() ``` ### 从导入特定模块并取别名 ```python import mypackage.module1 as mod1 mod1.some_function() ``` ### 从模块导入特定属性或方法 ```python from mypackage.module1 import some_function some_function() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值