Python 使用nosetest的特殊命名目录

Python 使用nosetest的特殊命名目录,python,unit-testing,import,nose,nosetests,Python,Unit Testing,Import,Nose,Nosetests,nosetests是否以不同的方式对待具有特定名称的目录?src目录是否特殊 如果我有一个源目录名为src的项目,nosetests似乎可以正常工作。但是,如果目录名为其他名称,nosetests会报告一系列导入错误 以下是我所做的: 运行测试 ~/src$ nosetests .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK 重命名目录 ~/

nosetests
是否以不同的方式对待具有特定名称的目录?
src
目录是否特殊

如果我有一个源目录名为
src
的项目,
nosetests
似乎可以正常工作。但是,如果目录名为其他名称,
nosetests
会报告一系列导入错误

以下是我所做的:

  • 运行测试

    ~/src$ nosetests
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK
    
  • 重命名目录

    ~/src$ cd ..
    ~/$ mv src/ src2
    
  • 重新运行测试

    ~/$ cd src2
    ~/src2$ nosetests
    E
    ======================================================================
    ERROR: Failure: ImportError (No module named **whatever**)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    ... etc. ...
        import **whatever**
    ImportError: No module named **whatever**
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    
    FAILED (errors=1) 
    
  • 我在文件里找不到关于这件事的任何东西


    示例:使用此目录结构:

    .
    |-- a
    |   |-- b.py
    |   `-- __init__.py
    |-- __init__.py
    `-- test
        |-- a
        |   |-- __init__.py
        |   `-- testb.py
        `-- __init__.py
    
    所有
    \uuuu init\uuuu.py
    文件均为空,
    a/b.py
    的内容包括:

    y = 3
    
    test/a/testb.py

    import a.b
    import unittest as u
    
    
    class TestB(u.TestCase):
    
        def test1(self):
            self.assertTrue(True)
    
        def test2(self):
            self.assertTrue(False)
    
    我可以可靠地重现这个问题。运行
    nosetests-V
    会给出:

    nosetests version 1.2.1
    

    快速解决方案是从顶级目录中删除
    \uuuu init\uuuu.py
    。另一个选项是使用相对导入,例如:将
    import a.b
    替换为
    from…a import b

    这种混乱和诡计的罪魁祸首是

    如果您运行的目录是一个包,那么nose不会将其添加到
    sys.path
    ,否则,它会将其添加()。然后,它进入抛出目录树并递归应用相同的逻辑。对所有受影响的文件也是如此。这解释了为什么它不能与
    \uuu init\uuu.py
    -根目录(
    src2
    )不在sys.path中-这就是为什么找不到包
    a

    但是,这里的开放性问题是:为什么它第一次在
    src
    文件夹中工作? 在这种情况下,
    src
    文件夹位于sys.path上。可能会有其他答案或编辑

    见相关问题:


    应该是简单的。你的测试中有哪些导入?相当多,两种情况下的导入完全相同。你认为某个特定的进口会导致问题吗?如果是这样的话,为什么目录没有命名为
    src
    ,而不是命名为src呢?好吧,我没有在目录中用一个简单的测试用例复制它。测试中的某些内容(或它们导入的smth)需要
    src
    模块存在。你能不能只留下一个简单的测试,除了
    TestCase
    class之外,不进行任何导入,然后再试一次?@AlexanderAfanasiev我添加了一个例子。不过,在它的任何地方都没有提到
    src
    。我真的被难住了(我已经在本地创建了提到的目录结构,是的,我复制了它。有趣的事实是:如果从根目录中删除
    \uu init\uuu.py
    ,它就会工作。如果我从setup.py和setup.py运行nosetest,我会从build/lib中遇到这个问题;build/lib/xxx有一个init.py,它的子模块不工作。