在python项目中调用来自不同包的模块

时间:2013-08-12 12:02:54

标签: python

我试图围绕在python中使用__init__文件,我虽然我做得不错,但我得到了一个“没有模块命名...”错误。

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

我还尝试使用from ..basic.stack import Stack使用PEP 238并获取错误

ValueError: Attempted relative import in non-package

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

2 个答案:

答案 0 :(得分:1)

__init__.py文件中,输入:

from myfile import *

例如:

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

__init__.py包含的位置:

from parens import *

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

测试文件夹中的__init__.py

__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

答案 1 :(得分:0)

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

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

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

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