【问题标题】:Module/class visible in whole project - Python整个项目中可见的模块/类 - Python
【发布时间】:2020-01-09 10:38:28
【问题描述】:

所以基本上我需要一个在项目的所有子目录中都可见的类。该类在 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

我已经尝试过相对导入,但它似乎不起作用。然后我尝试了最愚蠢的解决方案,将所需的类复制到我需要的任何地方,但我认为在整个项目中拥有相同文件的副本并不是一个好习惯。

我尝试的第二种解决方案是将 bar 文件夹复制到 site-packages。它有效,但我不确定将可能仅在此项目中使用的模块复制到 site-packages 是否明智。

有什么建议吗?

【问题讨论】:

    标签: python python-3.x python-module


    【解决方案1】:

    (我用编辑后问题的新内容编辑了我的答案)

    您的项目需要与start_script.py 处于同一级别的__init__.py 文件才能使用相对导入。

    现在您可以将您的课程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
    

    这对你有用吗?

    【讨论】:

    • 是的,它可以工作,但这并不是我想要的。我编辑了这个问题,所以现在可能更清楚了。
    • 我添加了__init__.py,但我得到了同样的错误ValueError: attempted relative import beyond top-level package。 @jacinator 的答案对我有用。不过,谢谢!
    【解决方案2】:

    你非常接近。我认为您唯一的问题是您正在尝试使用相对进口。在您的 gui.pyvending.py 内,您应该可以像这样导入。

    from bar.bar import Bar
    

    您不需要更改任何内容。我复制了您的目录结构并在我的计算机上进行了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2019-10-10
      • 2020-09-05
      相关资源
      最近更新 更多