Python鼻子導入錯誤



3 Answers

你在虛擬世界嗎? 在我的例子中, nosetests/usr/bin/nosetests ,它使用/usr/bin/python 。 virtualenv中的軟件包肯定不會在系統路徑中。 下面解決了這個問題:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
Question

我似乎無法讓鼻子測試框架在文件結構中識別測試腳本下的模塊。 我已經設置了最簡單的例子來說明問題。 我會在下面解釋它。

這是包文件結構:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py包含:

def dumb_true():
    return True

tests / test_foo.py包含:

import foo

def test_foo():
    assert foo.dumb_true()

這兩個init .py文件都是空的

如果我在主目錄(foo.py所在的位置)運行nosetests -vv ,我會得到:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

當我從tests /目錄中運行時遇到同樣的錯誤。 根據我發現的文檔和示例 ,nose應該將所有父包添加到該路徑以及它所調用的目錄中,但這似乎並沒有出現在我的情況中。

我使用Python 2.6.2運行Ubuntu 8.04。 如果重要的話,我已經手動構建並安裝了鼻子(不包括setup_tools)。




當然,如果在導入的模塊中有語法錯誤會導致這種情況。 對於我來說,當我在tests.py的同一個目錄中備份一個帶有諸如module / tests.bak.py之類的路徑的測試文件時,問題依然存在。 另外,要處理Django應用程序中的init包/模塊問題,可以運行以下命令(在bash / OSX shell中)以確保您沒有任何位於周圍的init .pyc文件:

find . -name '*.pyc' -delete



對於那些後來發現這個問題的人來說:如果我的測試目錄中沒有__init__.py文件,我會得到導入錯誤。

我的目錄結構如下所示:

./tests/
  ./test_some_random_stuff.py

如果我跑鼻子測試:

nosetests -w tests

它會給出其他人都看到的ImportError 。 如果我添加一個空白__init__.py文件,它工作得很好:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py



例如,對於以下目錄結構,如果要在m1m2m3運行nosetests以測試n.py某些函數, n.py應該使用test.py from m2.m3 import n

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py



Related