繁体   English   中英

从python项目中的不同包中调用模块

[英]Calling modules from different packages in a python Project

我试图绕过在python中使用__init__文件的想法,尽管我正确地做到了,但是却收到“ No module named ...”错误。

为了简单起见,我将项目链接到项目 有问题的问题是pythonds/test/parens.py ,我的所有目录中都有__init__.py文件,因此我不确定在哪里出错。

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

ValueError: Attempted relative import in non-package

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

__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

还只是注意到这可能是重复的: 我如何编写良好/正确的__init__.py包文件

烦人的是,您忽略了实际错误:没有模块命名为what 如果我怀疑它说“没有名为'pythonds'的模块,那么问题根本与__init__.py无关。这仅仅是因为基本pythonds目录不在您的Python路径上,可能是因为您在从自己的目录中运行测试。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM