Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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
Python ModuleNotFoundError测试套件(导入错误)_Python_Python Import - Fatal编程技术网

Python ModuleNotFoundError测试套件(导入错误)

Python ModuleNotFoundError测试套件(导入错误),python,python-import,Python,Python Import,当我运行带有一些测试的文件(例如pythontest\u website\u loads.py)时,测试运行得很好,没有问题,但是当我尝试testsuite(例如pythontest\u suite.py)时,会出现下一个错误: from special_module.special_module_file import Special_Class ModuleNotFoundError: No module named 'specialmodule' 我的目录如下: test_sui

当我运行带有一些测试的文件(例如pythontest\u website\u loads.py)时,测试运行得很好,没有问题,但是当我尝试testsuite(例如pythontest\u suite.py)时,会出现下一个错误:

    from special_module.special_module_file import Special_Class
ModuleNotFoundError: No module named 'specialmodule'
我的目录如下:

test_suite.py
tests/
  __init__.py
  test_website_loads.py
  special_module/
    __init__.py
    special_module_file.py
在我的special_module_文件中,我有一个名为special_class的类,我正在我的test_网站\u loads.py中导入这样的目录,如下所示:

from special_module.special_module_file import Special_Class
我的测试套件.py代码是:

import unittest
import HtmlTestRunner
from tests.test_website_loads import Test_Website_Loads

init_tests = unittest.TestLoader().loadTestsFromTestCase(Test_Website_Loads)

test_suite = unittest.TestSuite([
    init_tests
])

runner = HtmlTestRunner.HTMLTestRunner(output='reports', report_title='Test Report')
runner.run(test_suite) 
import unittest
import HtmlTestRunner
from special_module.special_module import Special_Class

class Test_Website_Loads(unittest.TestCase):

    def setUp(self):
        special = Special_Class()

    def ...():
        ...

    def tearDown():
        ...

if __name__ == "__main__":

    unittest.main(
        testRunner=HtmlTestRunner.HTMLTestRunner(output='init')
    )
我的测试网站\u loads.py代码是:

import unittest
import HtmlTestRunner
from tests.test_website_loads import Test_Website_Loads

init_tests = unittest.TestLoader().loadTestsFromTestCase(Test_Website_Loads)

test_suite = unittest.TestSuite([
    init_tests
])

runner = HtmlTestRunner.HTMLTestRunner(output='reports', report_title='Test Report')
runner.run(test_suite) 
import unittest
import HtmlTestRunner
from special_module.special_module import Special_Class

class Test_Website_Loads(unittest.TestCase):

    def setUp(self):
        special = Special_Class()

    def ...():
        ...

    def tearDown():
        ...

if __name__ == "__main__":

    unittest.main(
        testRunner=HtmlTestRunner.HTMLTestRunner(output='init')
    )

总之,有3个文件(A、B、C)。A调用B,B调用C。当我运行B时,它正确地导入了C。但当运行A时,B抛出ModuleNotFoundError。

这是因为它位于
测试
目录中,但您正在从
测试
的父目录运行
测试套件.py
。当您运行
test\u website\u loads.py时,它工作的原因是因为您是从
tests
目录中运行它的。解析导入时,Python解释器会检查模块的一系列位置,从当前目录开始,然后移动到其他位置,例如PYTHONPATH环境变量中的位置,以及Python安装位置中的
站点包
目录

我在我的系统上复制了这一点,但将import语句更改为tests.special_module.special_module_file
,它成功了。如果您不喜欢此解决方案,则需要更改
特殊_模块
目录或类似内容的位置

编辑:作为对您下面评论的回应,我假设您的
test\u suite.py
文件如下所示:

from tests.test_website_loads import some_function, some_class

result = some_function()
obj = some_class()

这仍然会遇到上述问题,因为Python解释器仍在顶级目录中运行。当它搜索模块时,它搜索当前目录,在那里它只找到
test\u suite.py
tests/
。然后检查PYTHONPATH环境变量。如果仍然没有找到任何内容,它将检查依赖于安装的默认位置(例如
站点包
目录),如果没有找到此类模块,它将抛出异常。我认为最好的解决方案是向PYTHONPATH环境变量添加
special_module
,如我上面包含的链接所述。否则,您可以使用
ln-s tests/special\u module special\u module
在顶级目录中创建指向该模块的符号链接,假设您运行的是类UNIX系统。但是,这不被视为最佳做法;首选第一种方法。

你说得没错,我没有写重要的部分,我没有在test_suite.py中导入特殊模块,我是在test_网站上调用它的(总之,test_suite.py调用test_website_loads.py,test_website_loads调用特殊模块,但它失败了,这确实有帮助。你能编辑你的原始问题以包含这些信息吗?另外,如果你能添加test_suite.py中用于调用test_website_loads.py的代码,这也会有帮助。我相信主issue仍然是我在回答中描述的那个,因为即使test_website_loads.py与特殊_模块目录位于同一个目录中,Python解释器仍然在父目录中运行,因此它仍然不知道在哪里可以找到特殊_模块目录;现在只需要找到一个解决方案@Arturoviles我编辑了我的原始答案以反映您的更正。它应该可以解决您的问题。如果没有,请让我知道。