当前位置:首页 » 编程语言 » python相对导入

python相对导入

发布时间: 2022-02-26 01:16:49

python导入py文件报错怎么办

其实这两个错误的原因归根结底是一样的:在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。
文件夹被python解释器视作package需要满足两个条件:
1、文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
2、不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。
补充:在"from YY import XX"这样的代码中,无论是XX还是YY,只要被python解释器视作package,就会首先调用该package的__init__.py文件。如果都是package,则调用顺序是YY,XX。
另外,练习中“from . import XXX”和“from .. import XXX”中的'.'和'..',可以等同于linux里的shell中'.'和'..'的作用,表示当前工作目录的package和上一级的package。

⑵ python 导入模块问题

导入模块是会执行一遍的
如果不想在导入模块时执行某部分代码,
需要将那部分代码到
if __name__=='__main__': 里面,
那部分代码只会在当他是作为主文件运行时才会跑

⑶ 求助一个关于python3.4的相对包导入问题,很初级

关于 from .. import 是如下说明的:

From…import 语句

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:
from fib import fibonacci

这个声明不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入到执行这个声明的模块的全局符号表。

From…import* 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

所以感觉你应当是用from b import * 和 from a import * 或者直接 import a,b

⑷ Python2.7中的相对导入有哪些问题,引入absolute

关于 from .. import 是如下说明的:From…import 语句Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:from modname import name1[, name2[, ... nameN]]例如,要导入模块fib的fibonacci函数,使用如下语句:from fib import fibonacci这个声明不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入到执行这个声明的模块的全局符号表。From…import* 语句把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:from modname import *这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。 所以感觉你应当是用from b import * 和 from a import * 或者直接 import a,b

⑸ python 中库怎么导入

让包内导入更加显式,这个功能的一部分设计初衷是,为了帮助脚本解决同名文件出现在模块搜索路径上多个不同位置时的二义性。考虑包目录,这定义了一个名为mypkg 的包,其中含有名为mypkg.main和mypkg.string 的模块。现在,假设模块main试图导入名为string的模块。在 Python 2.X和更早版本中,Python会先寻找mypkg目录以执行相对导入。这会找到并导入位于该处的string.py文件,将其赋值给mypkg.main模块命名空间内的名称string。不过,这一导入的本意可能是要导入Python标准库的string模块。可惜的是,在这些Python版本中,无法直接忽略mypkg.string 去寻找位于模块搜索路径更右侧的标准库中的string模块。此外,我们无法使用完整包导入路径来解决这个问题,因为我们无法依赖在每台机器上的标准链接库路径。换句话说,包中的简单导入可能具有二义性而且容易出错。在包内,我们无法确定imports pam语句指的是包内的模块还是包外的模块。一种可能的后果是,一个局部的模块或包会在不经意间隐藏了sys.path 上的另一个模块。
在实践中,Python使用者可以避免为他们自己的模块重复使用标准库模块的名称(如果需要标准string库,就不要把新的模块命名为string)。但是,一个包还是有可能意外地隐藏标准库模块。再者,Python 以后可能新增标准库模块,而其名称可能刚好就和自己的一个模块同名。而依赖于没有点号开头相对导入的程序代码同样也不容易理解,因为读者可能对希望使用哪个模块而感到困惑。所以我们最好能在代码中显式地指出导入的解析过程。

⑹ python 导入模块

在文件夹a的下面,新建一个__init__.py的py文件,
然后添加ab文件路径为系统路径:sys.path.append(ab文件路径)
最后利用:from a import a即可。

⑺ python为什么使用相对导入

除了让包内导入更加显式,这个功能的一部分设计初衷是,为了帮助脚本解决同名文件出现在模块搜索路径上多个不同位置时的二义性。考虑包目录,这定义了一个名为mypkg 的包,其中含有名为mypkg.main和mypkg.string 的模块。现在,假设模块main试图导入名为string的模块。在 Python 2.X和更早版本中,Python会先寻找mypkg目录以执行相对导入。这会找到并导入位于该处的string.py文件,将其赋值给mypkg.main模块命名空间内的名称string。
不过,这一导入的本意可能是要导入Python标准库的string模块。可惜的是,在这些Python版本中,无法直接忽略mypkg.string 去寻找位于模块搜索路径更右侧的标准库中的string模块。此外,我们无法使用完整包导入路径来解决这个问题,因为我们无法依赖在每台机器上的标准链接库路径。
换句话说,包中的简单导入可能具有二义性而且容易出错。在包内,我们无法确定imports pam语句指的是包内的模块还是包外的模块。一种可能的后果是,一个局部的模块或包会在不经意间隐藏了sys.path 上的另一个模块。
在实践中,Python使用者可以避免为他们自己的模块重复使用标准库模块的名称(如果需要标准string库,就不要把新的模块命名为string)。但是,一个包还是有可能意外地隐藏标准库模块。再者,Python 以后可能新增标准库模块,而其名称可能刚好就和自己的一个模块同名。而依赖于没有点号开头相对导入的程序代码同样也不容易理解,因为读者可能对希望使用哪个模块而感到困惑。所以我们最好能在代码中显式地指出导入的解析过程。

⑻ 如何在python3中正确导入同一目录下的模块

因为要absolute_import,这样import webchat_sdk.basic应该没问题了。

在 Python 2 里面可以使用 import foo来导入相同目录包下的模块foo,在 Python 3 里面就是导入的项目根目录(最上层有__init__.py的目录)包foo。 也就是说 Python 3 默认就是绝对导入的,import .foo只是相对于绝对导入来说的,并不是相对导入。

⑼ python包相对导入的陷阱是

包相对导入的陷阱:混合使用,相比于Python 2.X的隐式包相对导入,以及Python 2.X和3.X中的显式包相对导入点号语法,有些时候从 sys.path上一个路径出发的绝对包导入会是更推荐的选择。这一问题可能看上去难以理解,但是当你开始编写自己的包,可能就会变得更加重要了。 如前所述,Python 3.X的相对导入语法和默认绝对导入搜索规则,让包内导入变得显式从而使其更容易被注意和被维护,而且允许你在一些命名冲突的情况下显式地进行选择。然而,你也必须注意到该模型带来的下面两个结果:在Python 3.X和2.X中,包相对导入语句的使用会隐式地将一个文件与一个包目录的角色进行绑定,并禁止该文件通过其他方式被使用。在Python 3.X中,新的相对导入搜索规则改变意味着一个文件不能像在2.X中那样同时扮演脚本和包模块的角色。这些约束的理由有些微妙,不过由于下面的两条同时成立:Python 3.X和2.X不允许随意使用from .的相对导入语法,除非发起导入的文件本身作为包的一部分(即该文件在其他地方被导入)。Python 3.X的导入不会搜索一个包模块自身的路径,除非使用了from .的相对导入语法(或该模块位于当前工作路径、顶层脚本的主目录下)。使用相对导入会阻止你在2.X和3.X中创建同时扮演可执行程序和外部可导入包角色的目录项。此外,一些文件在3.X中不能像在2.X中那样同时扮演脚本和包模块的角色。就导人语句来说,这些规则可以归结为下面的两行代码的形式:前一行在Python 2.X和3.X中都只用于包模式,而后一行在3.X中只用于程序模式。
最终的效果是不论2.X还是3.X中的文件,你都应该只选择一种使用模式,即包模式(使用相对导入)或程序模式(使用简单导入),并将真正的包模块文件单独放到一个子目录中,与顶层脚本文件隔离开来。
另一方面,你可以尝试手动改变sys.path(通常是一项脆弱并易出错的任务)或总是通过绝对导入使用完整的包路径,并且假定包的根目录位于模块搜索路径上,来替代包相对导入语法或简单导入。

热点内容
java记事本程序 发布:2025-01-10 22:38:27 浏览:665
如何通过网吧电脑进入网吧服务器 发布:2025-01-10 22:22:30 浏览:706
数据库缓存是什么 发布:2025-01-10 22:21:05 浏览:386
dns配置出现错误该怎么办 发布:2025-01-10 22:13:00 浏览:439
云顶算法 发布:2025-01-10 22:10:07 浏览:991
收件服务器有什么作用 发布:2025-01-10 21:50:01 浏览:391
安卓70缓存 发布:2025-01-10 21:49:03 浏览:684
图像检索算法 发布:2025-01-10 21:43:58 浏览:559
plsqlforupdate 发布:2025-01-10 21:43:50 浏览:917
如何设置健康码快捷方式vivo安卓 发布:2025-01-10 21:39:52 浏览:504