我在Django项目中遇到了未解决的导入问题(在Eclipse w / PyDev中)。在针对特定问题进行谷歌搜索一段时间后,我通常可以找到正确的东西添加到PYTHONPATH来解决问题。但似乎我错过了一些概念或过程,通过这些概念或过程,我可以明确地说“显然我应该添加什么来正确导入该东西”。更令人沮丧的是,我只是遵循基本的Django教程,所以我希望能够简单地处理这些事情。在Java世界中,它通常很清楚,因为我可以确切地找到特定包来自哪个库,下载它并将其添加到构建路径。 Python / Django世界中的等价概念是什么?
我不打算在这里解决具体问题,而是知道要遵循的步骤,查找的位置或我缺少的概念。或者可能发现没有一个而且总是猜测......
我正在使用Ubuntu 10.10,Python 2.6
答案 0 :(得分:3)
如果您正在使用eclipse,她可以自动配置python解释器(包括系统安装的所有库)。你可能已经完成了这一步。
如果您仍然面临导入问题,则可能未在系统范围内安装库。或者您修改了python路径并删除了默认目录。
通常有一个带有python库的setup.py
。它会将该库安装到您的系统中:
python setup.py install
可以使用python package index从pip安装setup.py
附带的某些库。
如果库没有提供setup.py
脚本,那么您需要手动处理它。
关于python库的基本规则是:如果你没有在系统范围内安装它们,那么你必须手动将它们添加到python-path。
如果您不想在系统范围内安装大量库,virtualenv或buildout等工具可以提供帮助。
Virtualenv创建了一个可以安装库的环境,就像您要在全局安装库一样:
[path-to-virtualenv]/bin/python setup.py install
and your library will install to:
[path-to-virtualenv/lib/site-packages
Buildout的工作方式略有不同。您指定要在配置文件中安装的软件包列表,它将生成路径已修复的脚本文件。 Buildout还可以为pydev
项目生成配置设置。 Buildout是一种自动化工具,它有自己的方式来创建虚拟环境。 Buildout比virtualenv做更多的事情,但最初可能很难处理。
答案 1 :(得分:1)
从你的问题我认为你是Python的新手,所以让我们从头开始。
我的建议是查看Django生成的回溯并搜索如下所示的行:“ImportError:没有名为somemodule的模块”。这会告诉您缺少模块的名称。
一旦知道模块的名称,就可以尝试使用easy_install查看PyPi(Python包索引)中是否列出了缺少的模块。
尝试跑步:
easy_install somemodule
如果你很幸运,那么缺少的模块将被安装到你的python安装的site-packages目录中(可能是/usr/lib/python2.6/site-packages,具体取决于你的python的安装位置)。 site-packages目录是应该安装所有第三方模块的地方,并且此目录中的所有模块始终都是可导入的,并且在PYTHONPATH上。
您的代码可能会尝试导入PyPi上没有的内容,在这种情况下,Google是您的最佳选择:p
P.S。 如果easy_install不起作用(或者它缺失)那么你可能没有安装setuptools python模块,你可以从这里获得:http://pypi.python.org/pypi/setuptools
答案 2 :(得分:1)
如果你在系统范围内安装模块(站点包或类似的),你可能不会在系统上运行它们时遇到问题,所以我将讨论你项目的PYTHONPATH。
作为程序入口路径的文件目录将添加到PYTHONPATH,以及所有系统定义的PYTHONPATHS。要访问该目录结构中的任何脚本,每个目录必须包含一个名为__init__.py
的文件,该文件表示该目录是程序中的模块。
/myproject/
entrypoint.py
apps/
__init__.py
app1/
__init__.py
models.py
views.py
app2/
models.py # unreachable
views.py # unreachable
如果运行python entrypoint.py
,您将能够访问app1
,因为entrypoint.py
到app1
的所有文件夹都包含__init__.py
个文件。但是,app2
无法导入,因为它不作为模块显示。
如果您有一个模块目录,则必须确保它包含__init__.py
,或者/path/to/app1
在sys.path本身内,然后可以使用{{1 }}