⑴ 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包相对导入的陷阱是
包相对导入的陷阱:混合使用,相比于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(通常是一项脆弱并易出错的任务)或总是通过绝对导入使用完整的包路径,并且假定包的根目录位于模块搜索路径上,来替代包相对导入语法或简单导入。
⑶ 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为什么使用相对导入
除了让包内导入更加显式,这个功能的一部分设计初衷是,为了帮助脚本解决同名文件出现在模块搜索路径上多个不同位置时的二义性。考虑包目录,这定义了一个名为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为何使用相对导入
除了让包内导入更加显式,这个功能的一部分设计初衷是,为了帮助脚本解决同名文件出现在模块搜索路径上多个不同位置时的二义性。考虑包目录,这定义了一个名为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包相对导入陷阱
包相对导入的陷阱:混合使用,相比于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(通常是一项脆弱并易出错的任务)或总是通过绝对导入使用完整的包路径,并且假定包的根目录位于模块搜索路径上,来替代包相对导入语法或简单导入。
⑺ python怎么导入依赖包
python导入依赖包的方法:1、点击pycharm顶部的file标签,点击【setting】按钮;2、点击【Project:**】在右侧面板选中出现的【Project Interpreter】按钮,点击右方的【+】输入要安装库,安装即可。
第一步:打开pycharm:File-->Settings
第二步:Project:(你的项目名)-->Project InterPreter-->点击右边的加号
第三步:在窗口中搜索要下载的依赖-->选中并点击左下角的install package即可导入依赖包
推荐课程:Python 基础入门教程
⑻ 求助一个关于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
⑼ 如何把一个python包导入到python库中
Python 运行环境在查找模块时是对 sys.path 列表进行遍历,如果我们想在运行环境中添加自定义的模块,主要有以下三种方法:
1. 在sys.path列表中添加新的路径(只能对执行了 sys.path.append 命令的当前 Python 运行环境起作用,对其他运行环境不起作用,也即“一次性”的)。
>>> import sys
>>> sys.path
>>> sys.path.append('/home/xxx/yyy') #目录/home/xxx/yyy包含你所需要的包或模块
设置 PYTHONPATH 环境变量(永久性添加):
2. 将包或模块复制到 sys.path 列表中的目录(通过 sys.path 查看)里(如 /home/test/lib/python2.7/site-packages/ 目录)。
3. 最简单的办法是用 .pth 文件来实现。Python 在遍历已有的库文件目录(sys.path中指定)过程中,如果见到一个 .pth 文件,就会将该文件中所记录的路径加入到 sys.path 设置中,这样 .pth 文件说指明的库也就可以被 Python 运行环境找到。
$cd /home/test/lib/python2.7/site-packages/
$touch test.pth
$vim test.pth
$添加一行包或模块所在的目录(如:/home/test/somePackage/)
则test.pth文件内容为:
/home/test/somePackage/