dirFoo1\
Foo1.py
lib\
bar1.py
dirFoo3
Foo.cpp
dirFoo2
Foo2.py
lib\
bar2.py
Foo1 片段
# Foo1.py
import lib.bar1
Class bar1_class:
....
Foo2 片段
# Foo2.py
sys.path.append("../dirFoo1/lib")
sys.path.append("../lib") # tried removing this too
import Foo1
....
文件 Foo2.py 中的错误消息:
File <path_for_Foo2>
import Foo1 File <path_for_Foo1>
from lib.bar1 import bar1_class
ImportError: No module named bar1
当尝试从dirFoo1\Foo1.py
in使用库时dirFoo2\Foo2.py
。无论Foo1
和Foo2
其子lib目录中有自己的进口。
使用 sys 路径集导入Foo1
时Foo2
,
sys.path.append(dirFoo1)
导入错误出现在 Foo1 中的代码上
导入 lib.something_from_bar1
报告错误说不something_from_bar1
存在。似乎它指的是 lib in dirFoo2
。
我__init__.py
在dirFoo1
和的地方确实合适dirFoo2
。有没有办法从另一个未链接的文件夹中导入库__init__.py
?
如果您的两个dirFooX
文件夹都在 Python 模块搜索路径上,您将在这两个lib
文件夹之间发生冲突,这两个文件夹分别定义了不同的lib
包。您的代码只能访问其中之一。有几种不同的方法可以解决冲突。
最简单的方法是重命名一个或两个lib
文件夹,然后更新导入语句以匹配。lib
对于可在模块命名空间的顶层访问的包,该名称不是很具有描述性。也许他们应该是Foo1Lib
和Foo2Lib
。
另一种选择是 makedirFoo1
和dirFoo2
into 包,使lib
包成为两个不同命名空间中的子包。这可能是最好的方法,因为它不应该需要任何混乱sys.path
才能使导入工作。只需确保从顶级文件夹(文件夹上方)运行脚本dirFooX
,并使用-m
标志运行python -m dirFoo2.Foo2
而不是python dirFoo2/Foo2.py
。您需要更新所有地方的导入以使用绝对名称 ( from dirFoo1.lib.bar1 import bar_class
) 或显式相对名称 ( from .lib.bar1 import bar_class
)。
我的最后一个选择可能不是真正适合您情况的选择,但它会起作用。从 Python 3.3 开始,您可以拥有“命名空间”包,它可以从多个文件夹而不是一个文件夹加载模块。如果lib
是命名空间包,它将允许bar1.py
和bar2.py
文件都显示为lib
解释器中包的一部分。这主要用于大型项目,例如Django
可以通过第三方模块添加许多额外功能的项目。使用命名空间包允许将所有这些附加模块放入共享命名空间。lib
如果你真的想要,你可以制作一个命名空间包(尽管正如我上面所说的,lib
是如此通用,以至于在顶层使用该名称可能是个坏主意)。您需要做的就是删除__init__.py
每个lib
文件夹中的文件。就像我说的,这主要用于大型项目,其中许多模块应该是单个包的一部分,由不同的作者编写和分发。除非您的两个lib
文件夹非常密切相关,否则它可能不是适合您情况的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句