如何在不同目录下运行Python脚本时成功导入src.b模块?
解决方案
在scripts/a.py开头添加以下代码,即可实现两种执行方式下都能正常导入src.b:
import sys import os # 获取当前脚本a.py的绝对路径所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 定位到test目录(scripts目录的父目录) test_dir = os.path.dirname(script_dir) # 将test目录加入模块搜索路径 if test_dir not in sys.path: sys.path.append(test_dir) # 后续正常导入即可 import src.b
针对你的疑问逐一解答
- 是否需要导入sys并添加'..'?
直接添加'..'不可靠,因为'..'是相对当前工作目录的路径,而非脚本所在目录的相对路径。必须通过os.path获取脚本的绝对路径,再推导到test目录添加到sys.path,才能不受执行时的工作目录影响。 - 是否需要在src目录中添加__init__.py?
Python 3.3及以上支持无__init__.py的命名空间包,但为了兼容旧版本Python,同时明确标识src是一个Python包,建议在src目录下创建一个空的__init__.py文件。 - 是否需要使用
import ..src这样的相对导入?
不行。相对导入仅在脚本作为包的一部分被导入时生效(比如用python -m scripts.a),直接执行脚本时,脚本会被视为__main__模块,不支持这种跨目录的相对导入,会触发报错。 - 当前目录与脚本目录是否会影响结果?
影响极大。Python的模块搜索路径sys.path默认会把当前工作目录放在首位:在test目录执行时,当前工作目录是test/,src就在该目录下,所以能被找到;但在scripts目录执行时,当前工作目录是scripts/,src不在这个路径下,自然无法识别。我们添加test目录到sys.path的核心目的,就是让Python无论在哪执行,都能定位到src所在的位置。
内容的提问来源于stack exchange,提问作者user1801359
相关产品推荐
相关产品推荐

