我在我的django项目中对python的 importlib
做错了什么,但无法弄清楚。我认为与我不了解的道路有关。
当我将这些语句添加到我的项目的views.py
文件时,说明了错误的最简单示例:
import test32 # a file I created. Is legal Python.
import importlib # Django is using Python 2.7
importlib.import_module # confirms that the method exists
#importlib.import_module( 'test32' )
这可以正常工作,直到我删除最后一行为止。然后我有一个错误:
ImportError at /
No module named test32
Request Method: GET
Request URL: http://localhost:4321/
Django Version: 1.8
Exception Type: ImportError
Exception Value:
No module named test32
Exception Location: /Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/importlib/__init__.py in import_module, line 37
Python Executable: /Volumes/project663/bin/python
Python Version: 2.7.3
Python Path:
['/Volumes/project663/overall_project',
'/Volumes/project663/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg',
'/Volumes/project663/lib/python2.7/site-packages/pip-1.3.1-py2.7.egg',
'/Volumes/project663/lib/python2.7/site-packages/Django-1.8-py2.7.egg',
'/Volumes/project663/lib/python27.zip',
'/Volumes/project663/lib/python2.7',
'/Volumes/project663/lib/python2.7/plat-darwin',
'/Volumes/project663/lib/python2.7/plat-mac',
'/Volumes/project663/lib/python2.7/plat-mac/lib-scriptpackages',
'/Volumes/project663/lib/python2.7/lib-tk',
'/Volumes/project663/lib/python2.7/lib-old',
'/Volumes/project663/lib/python2.7/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac',
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages',
'/Volumes/project663/lib/python2.7/site-packages']
我尝试了import_module
语句的许多变体,并在名称之前使用点,并使用package
关键字,但它们都没有用。这种方法不难使用,所以我敢肯定我缺少明显的东西。
我真正想做的是将test32.py
放在子目录中,但首先我想在与views.py
相同的目录中使用它。
谢谢!
一种可能性是,在Python 2中,您仍然可以使用
进行相对导入import test32
语法,这与importlib
无法使用。Python 2.7的importlib
文档说:
此模块是更多可用的次数 来自Python 3.1的同名包装的完整包装 进口的完整实施。这里提供了什么 帮助简化从2.7到3.1。
我读到,作为importlib
的功能,就像Python3的import
一样,在其中应使用点syntax明确指定相对导入。
所以类似:
importlib.import_module('.test32', 'full.app.path')
可以工作。请注意" Test32"前面的点,我不知道您的完整应用路径,但是它会像'ProjectName.AppName'一样(基本上,Django Project中其他地方使用的导入。
<</p>