Python3在包内相对导入
我意识到关于StackOverflow的问题已经很多了,但我发现解决方案完全不清楚,而且常常相互矛盾 我有以下场景:我正在编写具有以下结构的python(python 3.4)包:Python3在包内相对导入,python,unit-testing,python-3.x,python-import,Python,Unit Testing,Python 3.x,Python Import,我意识到关于StackOverflow的问题已经很多了,但我发现解决方案完全不清楚,而且常常相互矛盾 我有以下场景:我正在编写具有以下结构的python(python 3.4)包: mypackage/ __init__.py (empty file) mydir1/ __init__.py (empty file) mymodule1.py mydir2/ __init__.py (empty file)
mypackage/
__init__.py (empty file)
mydir1/
__init__.py (empty file)
mymodule1.py
mydir2/
__init__.py (empty file)
mymodule21.py
mymodule22.py
mydir3/
__init__.py (empty file)
mymodule31.py
mymodule32.py
tests/
__init__.py (empty file)
test_something_in_mydir1.py
test_something_in_mydir2.py
test_something_in_mydir3.py
我希望tests/
目录中的文件包含包中所有内容的单元测试。问题是,无论我尝试哪种方法,都会出现以下错误:
SystemError:父模块“”未加载,无法执行相对导入
我应该注意,我希望它“开箱即用”,这意味着我不想使用绝对路径导入东西,也不想更改路径变量。所有这些解决方案似乎都不是很好的解决方案,这让我慢慢陷入困境。真的没有办法吗
我已经尝试了很多东西,包括下面的例子,但它们似乎都产生了相同的结果:
from ..mydir1.mymodule1 import *
from .mypackage.mydir1.mymodule1 import *
from ...mypackage.mydir1.mymodule1 import *
我已经尝试过覆盖每个\uuuuu init\uuuuuuuupy
文件中的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
有谁能告诉我如何构造文件test\u something\u in\u mydir1.py
中的导入(例如),以便能够访问mymodule1.py中的所有类/函数,以便对包进行单元测试?如果test\u something\u in\u mydir1.py
包含:
import unittest
from ..mydir1 import mymodule1
class Test1(unittest.TestCase):
def test1(self):
self.assertEqual(mymodule1.x,1) # mymodule1 trivially contains x=1
如果使用以下命令从包含包的目录(在本例中为C:\Test
)启动单元测试:
py -m unittest discover -v
通过相关导入发现并正确运行测试:
C:\Test>tree /f
Folder PATH listing
Volume serial number is CE8B-D448
C:.
└───mypackage
│ __init__.py
│
├───mydir1
│ mymodule1.py
│ __init__.py
│
├───mydir2
│ mymodule21.py
│ mymodule22.py
│ __init__.py
│
├───mydir3
│ mymodule31.py
│ mymodule32.py
│ __init__.py
│
└───tests
test_something_in_mydir1.py
__init__.py
C:\Test>py -m unittest discover -v
test1 (mypackage.tests.test_something_in_mydir1.Test1) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
没关系,我有一个命名错误,所以现在它发现了测试并尝试运行它,但是尽管使用了来自..mydir1.mymodule1 import*
的相对导入,它仍然会给我错误SystemError:Parent module''未加载,无法执行相对导入
我还尝试了从..mydir1导入mymodule1中执行,但也没有成功,产生了相同的错误。我确保在我的特定情况下这不是什么愚蠢的事情,甚至用与我在此处使用的占位符相同的标题重新创建了目录,并且确实出现了相同的问题。我创建了一个pastebin,以防它有助于查看我使用的确切命令和@RedHack的错误,您不能从包目录中运行unittest命令。您的pastebin示例是从tests目录运行的。我上面的例子是在C:\Test
中运行的,其中mypackage
是一个子目录。非常感谢。