【问题标题】:What is a general process/concept to determine what to add to PYTHONPATH to resolve import issues?确定要添加到 PYTHONPATH 以解决导入问题的一般过程/概念是什么?
【发布时间】:2011-06-29 08:17:52
【问题描述】:

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

我不是想在这里解决一个特定的问题,而是想知道要遵循哪些步骤,或者在哪里查找它,或者我缺少的概念。或者可能会发现没有一个,它总是猜测......

我在 Ubuntu 10.10、Python 2.6 上运行

【问题讨论】:

  • 你使用的是什么操作系统?

标签: python django pydev


【解决方案1】:

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

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

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

python setup.py install

setup.py 附带的一些库可以从python package indexpip 安装。

如果库不提供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 做了更多的事情,但一开始可能很难处理。

【讨论】:

    【解决方案2】:

    根据您的问题,我假设您对 Python 很陌生,所以让我们从头开始吧。

    我的建议是查看 Django 生成的回溯并搜索如下所示的行:“ImportError: No module named somemodule”。这会告诉您缺少的模块的名称。

    一旦您知道模块的名称,您可以尝试使用 easy_install 查看缺失的模块是否列在 PyPi(Python 包索引)中。

    尝试运行:

    easy_install somemodule
    

    如果你很幸运,那么缺失的模块将被安装到你的 python 安装的 site-packages 目录中(可能是 /usr/lib/python2.6/site-packages,取决于你的 python 的安装位置)。 site-packages 目录是所有 3rd 方模块应该安装到的位置,并且该目录中的所有模块始终是可导入的,并且位于 PYTHONPATH 上。

    您的代码可能正在尝试导入 PyPi 上不可用的内容,在这种情况下,Google 是您的最佳选择:p

    附言 如果 easy_install 不起作用(或丢失),则可能是您没有安装 setuptools python 模块,您可以从这里获得:http://pypi.python.org/pypi/setuptools

    【讨论】:

    • 这最终回答了我的具体问题,尽管实际上其他问题也很有用。
    【解决方案3】:

    如果您要在系统范围内安装模块(站点包或类似的),那么在您的系统上运行它们可能不会有问题,所以我将讨论您项目的 PYTHONPATH。

    作为程序入口路径的文件目录与所有系统定义的 PYTHONPATHS 一起添加到 PYTHONPATH。要访问该目录结构中的任何脚本,每个目录都必须包含一个名为 __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 本身中,然后可以简单地使用import models 导入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2014-02-07
      • 1970-01-01
      相关资源
      最近更新 更多