Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3在包内相对导入_Python_Unit Testing_Python 3.x_Python Import - Fatal编程技术网

Python3在包内相对导入

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)

我意识到关于StackOverflow的问题已经很多了,但我发现解决方案完全不清楚,而且常常相互矛盾

我有以下场景:我正在编写具有以下结构的python(python 3.4)包:

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
是一个子目录。非常感谢。