如何在不将父目录中所有兄弟目录添加到sys.path的情况下加载脚本的父目录作为模块?

2 投票
1 回答
1210 浏览
提问于 2025-04-16 08:57

我希望这个问题有个简单的答案,但我可能没注意到。

这是我的情况:

foo/
    __init__.py
    run.py

run.py的内容:

import foo

运行这个脚本:

$ python run.py 
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    import foo
ImportError: No module named foo

我找到的唯一解决办法是:

run.py的内容:

import sys
import os

path = os.path.abspath(__file__)
sys.path.append(os.path.join(os.path.dirname(path), "../"))

import foo

这样是可以工作的,但问题是(如果我没搞错的话)这样做会把foo/的父目录添加到sys.path中,这样就会在foo/的所有兄弟文件夹中搜索Python模块。

我有一种情况,我真的不想这样。我只想把一个特定的目录作为模块添加到我的路径中,但我不知道怎么做才能只添加这个模块,而不把它的父目录和所有其他子目录都添加进来。

我是不是漏掉了什么?有没有简单的方法可以把脚本的父文件夹作为模块添加进来?

1 个回答

0

我不太明白为什么 run 需要导入它的父 。毕竟,包只是用来把模块放在一起的工具,它本身并没有什么特别的功能。

包是一种组织 Python 模块命名空间的方法,使用的是“点分模块名”。比如,模块名 A.B 表示在名为 A 的包里有一个叫 B 的子模块。就像使用模块可以让不同模块的作者不用担心彼此的全局变量名一样,使用点分模块名也可以让像 NumPy 或 Python 图像库这样的多模块包的作者不用担心彼此的模块名。

你确定不想让 run 导入一个兄弟 模块 吗?你可以通过使用 相对导入 来实现这一点。

撰写回答