【问题标题】:Calling modules from different packages in a python Project从 python 项目中的不同包调用模块
【发布时间】:2013-08-13 17:38:06
【问题描述】:

我正在尝试在 python 中使用 __init__ 文件,虽然我做得正确,但我收到“没有名为...的模块”错误。

为了简单起见,我将项目放在这里link to project。有问题的问题是pythonds/test/parens.py,我的所有目录中都有__init__.py 文件,所以我不确定我哪里出了问题。

我也尝试过使用PEP 238 使用from ..basic.stack import Stack 并得到错误

ValueError: Attempted relative import in non-package

尽管我所要做的只是将__init__.py 文件粘贴到我的目录中以使它们成为一个模块,然后我就可以从不同的模块中调用它们。

【问题讨论】:

    标签: python


    【解决方案1】:

    令人讨厌的是,您忽略了实际错误:没有名为 what 的模块?如果,正如我怀疑的那样,它说“没有名为'pythonds'的模块,那么问题与__init__.py 根本无关。只是pythonds 基本目录不在你的Python 路径上,大概是因为你'从它自己的目录中运行测试。

    Python 会自动将 current 目录放在其路径中:因此,如果从pythonds 目录运行测试,您将能够执行from basic.stack import Stack。否则,您可以将目录的完整路径添加到 above parendssys.path

    其他一些提示:您可能已经知道collections 模块已经定义了一个双端队列类,并且列表已经可以很容易地用作堆栈。但更重要的是,请注意在 Python 中没有必要为每个类定义一个单独的文件:所有三个都可以存在于同一个 stack.py 文件中。

    另外,您的测试并不是真正的测试。您应该查看 unittest 模块,了解如何在 Python 中编写正确的单元测试。

    【讨论】:

      【解决方案2】:

      __init__.py 文件中,放入:

      from myfile import *
      

      例如:

      pythonds/test/parens.py
      pythonds/test/__init__.py
      

      __init__.py 将包含的位置:

      from parens import *
      

      这是旧 python 版本的肮脏快速修复版本。 考虑到您有多个子目录,对于所有 python 版本来说(见打击)会更好:

      在您的__init__.py 文件夹中的 test 位置:

      __all__ = ['tacos','falaffels']
      from test.tacos import factory
      from test.falaffels import stand
      

      如果您有以下文件夹结构,上述应该可以工作:

      main.py
      /test/
          __init__.py
          tacos.py
          falaffels.py
      

      还刚刚注意到这可能与以下内容重复:How do I write good/correct package __init__.py files

      【讨论】:

        猜你喜欢
        • 2020-04-29
        • 1970-01-01
        • 2012-05-19
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        相关资源
        最近更新 更多