资讯专栏INFORMATION COLUMN

python包相对导入

crossoverJie / 1872人阅读

摘要:包中的一个模块可以采用相对路径导入包,不影响模块功能一个脚本未成为模块,即其目录及父目录内无可以采用相对路径导入包,并以脚本模式运行。参考相对导入与绝对导入

绝对路径导入格式为import a.b或者from a import b,相对路径导入格式为from . import b或者from ..a import b

python2默认为相对路径导入,python3默认为绝对路径导入。

为使python2,3通用,建议采用相对路径导入from .a import b

一个目录存在__init__.py文件,则该目录成为一个包。

包中的一个模块可以采用相对路径导入包,不影响模块功能;一个py脚本(未成为模块,即其目录及父目录内无__init__.py)可以采用相对路径导入包,并以脚本模式运行。但包含相对导入的模块,不能直接以脚本模式运行,常见报错为:

# python2
Traceback (most recent call last):    File "module_x.py", line 1, in       from . module_y import spam as ham  ValueError: Attempted relative import in non-package
# python3
Traceback (most recent call last):    File "module_x.py", line 1, in       from . module_y import spam as ham  SystemError: Parent module "" not loaded, cannot perform relative import
解决方案:

建立示例文件结构如下:
注:以/结尾的为文件夹。

/home/zhkai/
            mobike/
                  __init__.py
                  utils.py
                  data_process/
                          loc.py

注意此时mobike成为一个python包。
loc.py中导入utils.py该怎么办?

方法1:将mobike包导入系统路径

loc.py中导入util的方法为:

import sys
sys.path.append("/home/zhkai")
from mobike.utils import read_csv 

需要注意,这里导入系统路径的是mobike所在目录的路径,路径本身不包含mobike。
此时utils就像自带的python包一样,loc.py可直接运行。

【推荐】方法2:修改运行命令

python的man page里有这个参数:

-m module-name 
   Searches  sys.path for the named module and runs the corresponding .py file as a script. 

所以可以在不修改模块代码文件的情况下:
代码文件仍为相对路径:

from ..utils import read_csv

切换到mobike包同级目录下执行:

☁  ~  python3 -m mobike.data_process.loc

注意:此时若loc.py代码中有其他相对路径,此时的相对路径是基于shell命令所在位置,即~的,可能会造成错误。import语句中的相对路径,仍是基于文件所在位置,故不影响。

推荐这种方法,因为无需修改代码文件。

还有句话不太理解:
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。


参考:
Python 相对导入与绝对导入

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40759.html

相关文章

  • Python相对导入导致SystemError的解决方案(译)

    摘要:相对导入相对导入使用模块的决定它是否在一个包内。当你是用类似进行相对导入的时候,点表明在包的层次中上升多少。所以,你不能在交互式会话中直接使用任何相对导入。 源题目与答案地址如下http://stackoverflow.com/questions/14132...。下面是我的翻译(看作机翻也行),以及原文。 这个问题是如何解决在相对导入的时候,如果出现System Error的时候的解...

    ethernet 评论0 收藏0
  • python基础教程:,对,没错,绝对不是双肩

    摘要:比如,模块名表示包中名为的子模块。例如,文件可以包含以下代码定义了之后,就会把,,导入到当前命名空间。这种导入使用前导点来指示相对导入中涉及的当前包和父包。也就是说被执行的主程序里面不能包含相对导入。 包,Package,是一种Python模块的集合,从文件组织形式上看,包就是一个文件夹,里面放着各种模块(.py文件),也可以有子文件夹(子包)。包名构建了一个Python模块的命名空间...

    wuyangnju 评论0 收藏0
  • Python3】Python模块与导入

    摘要:模块与包的导入一模块导入定义模块,是一个文件,以结尾,包含了对象定义和语句。使用模块还可以避免函数名和变量名冲突。特别注意的是自定义的模块名不应该与系统内置模块重名。包是由一系列模块组成的集合。模块的导入使用语句。 【Python3】Python模块与包的导入 一、模块导入 1. 定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Pytho...

    CoyPan 评论0 收藏0
  • Python Package Import 之痛

    摘要:所以,解决方案是强制要求从整个项目的顶层用来设置端正的路径。这个做法是官方推荐的,也是合逻辑的,即一个完整的项目运行就应当以项目为入口来运行所有的子或子。经过不断的实践,发现他们大都没说清楚上下文,甚至没有告诉完整的解决方案。 参考Python官方:Packages▶参考:Python相对导入一处不解参考:使用相对路径名导入包中子模块 理解Package Python里,就像所有的.p...

    nihao 评论0 收藏0
  • Python入门细节

    摘要:入门细节相除后的类型双斜杠是整除,出来的类型是。序列,集合和字典属于组,是的基本数据类型。变量名区分大小写。尽量避免循环引入。变量函数等引入内指定的变量函数等。中如果没有出现模块名也是绝对导入。顶级包与入口文件的位置 python入门细节 相除后的类型 type(2/2) float type(2//2) int 双斜杠是整除,出来的类型是int。单斜杠的出来的是float类型。 进制...

    microcosm1994 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<