我遇到了奇怪的错误,调用./manage.py test
会找到我的测试但抱怨他们无法导入。
Python 3.4
Django 1.7b4
看起来像这样(只是相关的位):
inkasso
├── db.sqlite3
├── functional_tests
│ ├── base.py
│ ├── base.pyc
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── __pycache__
│ ├── test_login.py
│ └── test_login.pyc
├── __init__.py
├── inkasso
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── migrations
│ ├── models.py
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── static
│ ├── ...
├── templates
│ ├── ...
└── web
├── admins.py
├── tests
│ ├── __init__.py
│ ├── test_forms.py
│ ├── test_models.py
│ └── test_views.py
├── urls.py
└── views.py
因此,当我运行./manage.py test
时,我得到以下标记:
$ ./manage.py test
Creating test database for alias 'default'...
EEEE
======================================================================
ERROR: inkasso.functional_tests.test_login (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
yield
File "/usr/lib/python3.4/unittest/case.py", line 574, in run
testMethod()
File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
raise exception
ImportError: Failed to import test module: inkasso.functional_tests.test_login
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
module = self._get_module_from_name(name)
File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
__import__(name)
ImportError: No module named 'inkasso.functional_tests'
======================================================================
ERROR: inkasso.web.tests.test_forms (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
yield
File "/usr/lib/python3.4/unittest/case.py", line 574, in run
testMethod()
File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_forms
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
module = self._get_module_from_name(name)
File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
__import__(name)
ImportError: No module named 'inkasso.web'
======================================================================
ERROR: inkasso.web.tests.test_models (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
yield
File "/usr/lib/python3.4/unittest/case.py", line 574, in run
testMethod()
File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_models
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
module = self._get_module_from_name(name)
File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
__import__(name)
ImportError: No module named 'inkasso.web'
======================================================================
ERROR: inkasso.web.tests.test_views (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
yield
File "/usr/lib/python3.4/unittest/case.py", line 574, in run
testMethod()
File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_views
Traceback (most recent call last):
File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
module = self._get_module_from_name(name)
File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
__import__(name)
ImportError: No module named 'inkasso.web'
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (errors=4)
Destroying test database for alias 'default'...
所以测试运行器找到我的测试,但由于某种原因,他们没有导入。我不知道它到底发生了什么。堆栈跟踪对我没有多大帮助:(
由于根文件夹名为inkasso
并且它有一个同名的模块,我尝试将print(os.getcwd)
和print(sys.path)
放入manage.py,它显示的只是CWD和路径都设置为指向根文件夹,所以它应该是好的,不是吗?应用程序本身按预期运行。只有测试不起作用。
对于咯咯笑,我尝试创建一个空模块' web'在inkasso.inkasso中,结果不是抱怨inkasso.web不存在,而是现在抱怨inkasso.web.tests不存在。所以这表明,而不是寻找根源' inkasso'文件夹,它在' inkasso.inkasso'中查找。这就是问题所在。我该如何解决?
答案 0 :(得分:23)
是的...运行./manage.py
时出现问题,因为它将当前目录添加到PYTHONPATH。
将__init__.py
放在根文件夹中时会发生此问题。
在这种情况下,一种解决方案是永远不要使用manage.py
,而只使用django-admin.py <commands> --settings=inkasso.inkasso.settings
- 当然,这假设在运行此命令时,你只需要一级,在你之外根文件夹inkasso
,或者您已在site-packages
中安装了主包。
例如,如果settings.py
文件的完整路径为/home/user/projects/inkasso/inkasso/settings.py
,则运行此命令时需要位于/home/user/projects
。
但是,如果您的网站包中已安装了您的软件包,则上述限制会发生变化:您可以在/home/user/projects/inkasso
或其任何子文件夹之外的任何位置进行更改。
另一种解决方案是编辑manage.py
文件以添加此行:
if __name__ =='__main__': #line already present
#this will make the python interpreter see your packages as inkasso.inkasso.whatever
os.chdir('..') # <<<---This is what you want to add
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mvod.dev_settings")
....