Module/class 在整个项目中可见 - Python
Module/class visible in whole project - Python
所以基本上我需要一个在项目的所有子目录中都可见的 class。 class 在 bar.py 脚本中定义,我需要在放置 <here>
标记的脚本中实例化一个对象。
项目结构如下,程序以start_script.py开始。
base/
start_script.py
gui/
__init__.py
gui.py
<here>
vending/
__init__.py
vending.py
<here>
foo/
__init__.py
foo.py
<here>
bar/
bar.py
__init__.py
我已经尝试过相对导入,但它似乎不起作用。然后我尝试了最愚蠢的解决方案,将所需的 class 复制到我需要的任何地方,但我认为在整个项目中复制同一文件并不是一个好习惯。
我尝试的第二个解决方案是将 bar 文件夹复制到 site-packages
。它有效,但我不确定将可能仅在该项目中使用的模块复制到 site-packages
.
是否明智
有什么建议吗?
(我用编辑问题的新内容编辑了我的答案)
您的项目需要与 start_script.py
处于同一级别的 __init__.py
文件才能使用相对导入。
现在您可以将 class 添加到 SpecialSnowflake
中,例如 start_script.py
并像这样使用它:
# file base/gui/gui.py
from ..start_script import SpecialSnowflake
# file base/vending/vending.py
from ..start_script import SpecialSnowflake
# file base/foo/foo.py
from ..start_script import SpecialSnowflake
这对你有用吗?
你非常接近。我认为您唯一的问题是您正在尝试使用相对导入。在您的 gui.py
或 vending.py
中,您应该可以像这样导入。
from bar.bar import Bar
您不需要更改任何内容。我复制了您的目录结构并在我的计算机上进行了测试。
所以基本上我需要一个在项目的所有子目录中都可见的 class。 class 在 bar.py 脚本中定义,我需要在放置 <here>
标记的脚本中实例化一个对象。
项目结构如下,程序以start_script.py开始。
base/
start_script.py
gui/
__init__.py
gui.py
<here>
vending/
__init__.py
vending.py
<here>
foo/
__init__.py
foo.py
<here>
bar/
bar.py
__init__.py
我已经尝试过相对导入,但它似乎不起作用。然后我尝试了最愚蠢的解决方案,将所需的 class 复制到我需要的任何地方,但我认为在整个项目中复制同一文件并不是一个好习惯。
我尝试的第二个解决方案是将 bar 文件夹复制到 site-packages
。它有效,但我不确定将可能仅在该项目中使用的模块复制到 site-packages
.
有什么建议吗?
(我用编辑问题的新内容编辑了我的答案)
您的项目需要与 start_script.py
处于同一级别的 __init__.py
文件才能使用相对导入。
现在您可以将 class 添加到 SpecialSnowflake
中,例如 start_script.py
并像这样使用它:
# file base/gui/gui.py
from ..start_script import SpecialSnowflake
# file base/vending/vending.py
from ..start_script import SpecialSnowflake
# file base/foo/foo.py
from ..start_script import SpecialSnowflake
这对你有用吗?
你非常接近。我认为您唯一的问题是您正在尝试使用相对导入。在您的 gui.py
或 vending.py
中,您应该可以像这样导入。
from bar.bar import Bar
您不需要更改任何内容。我复制了您的目录结构并在我的计算机上进行了测试。