我知道python模块导入问题在课程中是相当常见的,通常我对它的工作方式相当有能力,但是我所处的这种情况完全让我感到困惑。
我有一个结构类似于此的项目:
myproj
|- __init__.py
|- somefile.py这很简单,在TorchServe中的AWS TorchServe上运行也很好(尽管这并没有那么重要)。
现在,我在一个库中复制到我的项目的根,这随后有子文件夹(模块),其中引用其他的。
myproj
|- __init__.py
|- somefile.py
|- third_party_lib
|- models
| |- A.py
|- utils
|- B.py在我的主somefile.py中,我有一个类似于
from third_party_lib.models.A import XYZ在文件A中有一个导入。
from utils.B import XYZ这就是事情失败的地方,有许多类似于此的内部导入是无法解决的。
第三方库没有init.py,但是我尝试添加一个,但这并没有解决问题。我还尝试在sys.path.append文件夹上使用third_party_lib ()扩展路径。
在这种情况下,由于third_party_lib是一个git子树,不是由我自己维护的,所以如果可能的话,我更愿意在它内不做任何更改(否则,将来在进行上游更新时,事情会变得很混乱),但是如果需要的话,我可以在其中放置一个init.py,因为这很容易维护。
我现在有点不知所措,我希望这是Python模块如何工作的简单困惑之一。
谢谢您的帮助,如果您需要更多的信息,请告诉我。
发布于 2021-03-22 13:38:25
我很不好意思承认,但这是我的愚蠢错误。万一有人遇到类似的问题,那就是我改进sys路径的方式。
from pathlib import Path
sys.path.insert(0, (Path(__file__).parent / 'some_folder').resolve())很容易忽略的问题是,放入路径数组中的项实际上是Path对象!不是字符串,解决方案是将路径调用包装在str()中。
from pathlib import Path
sys.path.insert(0, str((Path(__file__).parent / 'some_folder').resolve()))这是一件非常简单的事情,特别是当我每次打印sys.path时,但是很容易忽略数组中的项实际上是用PosixPath("xxxxxxxxxxx")包装的,而不是原始的str。
https://stackoverflow.com/questions/66745876
复制相似问题