Python:从另一个子目录导入文件

3

我的目录结构如下:

mycode
|
└-----dirA
|     └─---- fileA.py
└─----dirB
      └─---- fileB.py

我该如何从文件A.py中导入fileB.object?我已经在所有文件夹中都包含了__init__.py文件,包括“mycode”,但我仍然不断收到错误消息,无法从文件A.py中找到fileB.py,并且相对导入也无效。

要进行调试,请在您正在运行的文件顶部添加 import sys print(sys.path)。这将提供一些关于当前系统路径中有哪些文件夹的想法。 - Nandha
2
你是否考虑将你的代码打包并安装到你的环境中? - Thomas Hilger
你如何启动程序以及从哪个目录开始?由于顶层脚本不是包的一部分,所以相对导入无法使用。 - tdelaney
不知道filaA.py如何执行是无法回答这个问题的。您是否在dirA目录下并且作为脚本运行(例如 python3 fileA.py)?是否有其他脚本import mycode.dirA.fileA?在任一情况下,mycode的父级需要在sys.path中。通常的解决方法是使包可安装,然后安装它。有一些技巧(黑科技)可绕过此问题,但安装是正常的解决方案。 - tdelaney
3个回答

1

在Python中,有一种独特的方法可以向后遍历树:

  • 使用一个点.表示同一目录
  • 使用两个点..表示父目录
  • 使用三个点表示祖父级目录...
  • 以此类推

尝试使用:

from ..dirB.fileB import <symbol>

1
这是正确的答案,我不知道 Python 导入系统的这个部分,+1。无论如何,Python 的导入系统很混乱,不幸的是。 - FLAK-ZOSO
1
@FLAK-ZOSO - 这是正确的答案...因为您不理解导入系统?忽略赞数。除非mycode在Python中已知为一个包,否则这将不起作用。导入系统并不混乱,只是您有脚本可执行路径和模块路径(就像操作系统中的LIB路径一样)。 - tdelaney
@tdelaney 所以你必须 sys.path.append 目录,对吗? - FLAK-ZOSO
@tdelaney,如果你想导入一个不是直接子类的东西,这是一种方法。还有其他方法,比如改变路径,这些方法不一定更好或更差(这取决于情况)。你可以说应该找到更好的方法来构建项目树,这完全合理,但我认为这不是问题的本质。 - Daniel Trugman
1
@FLAK-ZOSO - 你可以插入或追加。只要mycode的_parent directory_在sys.path中的某个位置即可。Python将扫描sys.path中的所有目录以查找包名称。但这引发了第二个问题,mypath必须已经在某个地方被导入过了。顶层脚本(不在包中)或其他模块需要导入它。 - tdelaney

0

您可以使用sys.path.insert()方法:

import sys
sys.path.insert(0, './subdirectory')
import myfile

你可以在这里阅读更多相关信息。


这正是我两分钟前在回答中写的内容,但它被踩了,所以我猜测 OP 不是在寻找这种类型的答案。 - FLAK-ZOSO
@FLAK-ZOSO sys.path.insertsys.path.append之间有区别。由于Python将加载第一个模块并忽略其余模块,因此问题中的OP模块需要插入到sys.path的第一个位置(在这种情况下为索引0),而不是像append一样将给定路径添加到sys.path列表的末尾,这可能不是他们正在寻找的或者对他们没有起作用。 - Archeologist
@BlockDiagram01,很抱歉让你失望,但如果没有冲突,appendinsert的作用是完全相同的。我认为这里问题的本质不在于冲突,而在于一个脚本能否访问第二个脚本。 - Daniel Trugman
@BlockDiagram01 - 我不理解插入和追加的区别。它必须在sys.path中 - 最好通过安装模块来实现。除非您有多个同名包,否则其在路径中的位置并不重要。而这本身就是一个问题。 - tdelaney

0
如果Python输出的结果中找不到文件夹,那么你必须正确设置目录,例如:
应该是C:\Users\Desktop\DirectoryName 而不是FolderDirectory:FolderName 我的意思是你应该设置正确的目录路径,因为程序并不是真正聪明的可以轻松定位它,而只是一堆你想要正确执行的指令。

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