在Python中从相邻文件夹导入模块

21

我已将问题放在下图中:

enter image description here

编辑 紧接着图片的问题是:

如何让 script_A1 从script_B2 中导入一个函数?

类似的问题之前已经被问过。但大多数答案建议将模块/脚本/包(无论哪种)添加到 PATH 变量中。例如:

sys.path.append('...')

但是,将模块添加到PATH变量中感觉非常不正确。我不想以任何方式改变我的系统。当我的应用程序关闭时,我希望我的Python环境干净且“未改动”。我担心在我的系统上添加不受控制的模块到PATH变量会在以后引起麻烦。

谢谢您的帮助:-)


1
将内容添加到 sys.path 不是一种持久性的更改;它不会对 PATHPYTHONPATH 做任何事情。这可能不是最好的方法,但它不会有你担心的问题。 - user2357112
2
我不知道为什么有人踩了我的问题。在踩之前,请留下评论,解释一下我可以做得更好的地方。我是一个讲理的人,愿意倾听。 - K.Mulier
2
提案:在关闭原因中添加文本形式的文本。 - Darrick Herwehe
1
是的,我在图旁边放了很多文本。 - K.Mulier
1
@K.Mulier,那段文本无法被Google和其他网站爬虫搜索到。你的问题应该是实际文本。你把文本放在图片中,这对任何人都没有帮助。 - Darrick Herwehe
显示剩余3条评论
4个回答

8

您可以使用一个技巧,将顶级文件夹添加到路径中:

import sys
sys.path.append('..')
import folderB.something

你也可以使用 imp.load_source 如果你更喜欢的话。

1
有人评论说:“将内容添加到sys.path并不是一种持久性的更改;它对PATH或PYTHONPATH没有任何影响。”这是真的吗?因为那将是很棒的。 - K.Mulier
2
是的,它实际上不会改变您的系统变量。它只会影响当前的脚本进程。 - Ronen Ness
这是一种通过路径加载模块的方法:“加载并初始化作为Python源文件实现的模块,并返回其模块对象。” - 阅读我附加的链接,那里有许多有用的函数,您可能想要检查。 - Ronen Ness
非常感谢!我明天会在工作中进行测试,但我相信它会没问题。我会将您的答案标记为正确的,因为您真的很有帮助。如果没有成功,您是否愿意继续协助? - K.Mulier
没问题,但是以后请在确认答案有效之后再接受它们 :) - Ronen Ness
显示剩余5条评论

0

我想我解决了这个问题。

以下是一种方法,您可以将父目录附加到PATH中。将其放在script_A1的顶部:

import sys
import os
myDir = os.path.dirname(os.path.abspath(__file__))
parentDir = os.path.split(myDir)[0]
if(sys.path.__contains__(parentDir)):
    print('parent already in path')
    pass
else:
    print('parent directory added')
    sys.path.append(parentDir)

# Now comes the rest of your script

你可以通过打印以下内容来验证父目录myProject是否确实已添加到PATH中:
    print(sys.path)

由于父目录 myProject 现在是路径的一部分,你可以从任何其子目录中导入脚本/模块/等等。这是如何从 folder_B 导入 script_B2 的方式:
import folder_B.script_B2 as script_B2

在关闭应用程序后,您可以验证Python环境是否恢复到其初始状态。只需再次打印PATH并检查您附加的目录是否已消失即可。


0
正如Ronen Ness所提到的,您可以使用imp来实现您想要的功能。在script_A1.py的开头:
import imp 
file, path, description = imp.find_module("folderB", ["./folderB"])
imp.load_module("folderB", file, path, description)
from folderB.script_B2 import *

-1
将以下代码放置在 script_A1 的顶部:
```python from folderB.script_B2 import YourClass as your_class ```

4
很抱歉,但这种方法行不通。我试过了。无论如何,还是谢谢你的帮助;-) - K.Mulier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接