什么是确定要添加到PYTHONPATH以解决导入问题的一般过程/概念?

时间:2011-02-17 19:22:04

标签: python django pydev

我在Django项目中遇到了未解决的导入问题(在Eclipse w / PyDev中)。在针对特定问题进行谷歌搜索一段时间后,我通常可以找到正确的东西添加到PYTHONPATH来解决问题。但似乎我错过了一些概念或过程,通过这些概念或过程,我可以明确地说“显然我应该添加什么来正确导入该东西”。更令人沮丧的是,我只是遵循基本的Django教程,所以我希望能够简单地处理这些事情。在Java世界中,它通常很清楚,因为我可以确切地找到特定包来自哪个库,下载它并将其添加到构建路径。 Python / Django世界中的等价概念是什么?

我不打算在这里解决具体问题,而是知道要遵循的步骤,查找的位置或我缺少的概念。或者可能发现没有一个而且总是猜测......

我正在使用Ubuntu 10.10,Python 2.6

3 个答案:

答案 0 :(得分:3)

如果您正在使用eclipse,她可以自动配置python解释器(包括系统安装的所有库)。你可能已经完成了这一步。

如果您仍然面临导入问题,则可能未在系统范围内安装库。或者您修改了python路径并删除了默认目录。

通常有一个带有python库的setup.py。它会将该库安装到您的系统中:

python setup.py install

可以使用python package indexpip安装setup.py附带的某些库。

如果库没有提供setup.py脚本,那么您需要手动处理它。

关于python库的基本规则是:如果你没有在系统范围内安装它们,那么你必须手动将它们添加到python-path。

如果您不想在系统范围内安装大量库,virtualenvbuildout等工具可以提供帮助。

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.pyapp1的所有文件夹都包含__init__.py个文件。但是,app2无法导入,因为它不作为模块显示。

如果您有一个模块目录,则必须确保它包含__init__.py,或者/path/to/app1在sys.path本身内,然后可以使用{{1 }}