摘要:包中的一个模块可以采用相对路径导入包,不影响模块功能一个脚本未成为模块,即其目录及父目录内无可以采用相对路径导入包,并以脚本模式运行。参考相对导入与绝对导入
绝对路径导入格式为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该怎么办?
在loc.py中导入util的方法为:
import sys sys.path.append("/home/zhkai") from mobike.utils import read_csv
需要注意,这里导入系统路径的是mobike所在目录的路径,路径本身不包含mobike。
此时utils就像自带的python包一样,loc.py可直接运行。
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
摘要:相对导入相对导入使用模块的决定它是否在一个包内。当你是用类似进行相对导入的时候,点表明在包的层次中上升多少。所以,你不能在交互式会话中直接使用任何相对导入。 源题目与答案地址如下http://stackoverflow.com/questions/14132...。下面是我的翻译(看作机翻也行),以及原文。 这个问题是如何解决在相对导入的时候,如果出现System Error的时候的解...
摘要:比如,模块名表示包中名为的子模块。例如,文件可以包含以下代码定义了之后,就会把,,导入到当前命名空间。这种导入使用前导点来指示相对导入中涉及的当前包和父包。也就是说被执行的主程序里面不能包含相对导入。 包,Package,是一种Python模块的集合,从文件组织形式上看,包就是一个文件夹,里面放着各种模块(.py文件),也可以有子文件夹(子包)。包名构建了一个Python模块的命名空间...
摘要:模块与包的导入一模块导入定义模块,是一个文件,以结尾,包含了对象定义和语句。使用模块还可以避免函数名和变量名冲突。特别注意的是自定义的模块名不应该与系统内置模块重名。包是由一系列模块组成的集合。模块的导入使用语句。 【Python3】Python模块与包的导入 一、模块导入 1. 定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Pytho...
摘要:所以,解决方案是强制要求从整个项目的顶层用来设置端正的路径。这个做法是官方推荐的,也是合逻辑的,即一个完整的项目运行就应当以项目为入口来运行所有的子或子。经过不断的实践,发现他们大都没说清楚上下文,甚至没有告诉完整的解决方案。 参考Python官方:Packages▶参考:Python相对导入一处不解参考:使用相对路径名导入包中子模块 理解Package Python里,就像所有的.p...
摘要:入门细节相除后的类型双斜杠是整除,出来的类型是。序列,集合和字典属于组,是的基本数据类型。变量名区分大小写。尽量避免循环引入。变量函数等引入内指定的变量函数等。中如果没有出现模块名也是绝对导入。顶级包与入口文件的位置 python入门细节 相除后的类型 type(2/2) float type(2//2) int 双斜杠是整除,出来的类型是int。单斜杠的出来的是float类型。 进制...
阅读 831·2021-11-25 09:43
阅读 3657·2021-11-19 09:40
阅读 858·2021-09-29 09:34
阅读 1754·2021-09-26 10:21
阅读 850·2021-09-22 15:24
阅读 4146·2021-09-22 15:08
阅读 3230·2021-09-07 09:58
阅读 2582·2019-08-30 15:55