【问题标题】:something wrong with my pythonpath我的 pythonpath 出了点问题
【发布时间】:2011-02-24 20:52:50
【问题描述】:

我知道这是一个愚蠢的问题,但我很难过。我的目录结构曾经是这样的:

-src
  |
  -module.py
  -program.py

当这是我的目录结构时,我从程序中引用了模块,一切都很好。

我已经将我的目录结构更改为:

-src
  |
  -__init.py
  -module.py
  |
  -programDir
    |
    -__init.py
    -program.py

现在,当然,我无法从程序访问模块。如何将 src 作为包引用。我试图创建一个

__init__.py 

src 目录中的文件,但没有运气。

Moar deets: 我在 program.py 中尝试过的 import 语句:

import module

from src import module

当另一个模块和程序在同一目录中时,第一个工作。

我得到的错误:

ImportError: No module named module

仅作记录:不,我的模块和程序不称为模块或程序

更新:我已经在我的 program.py 文件中尝试过这个:

from ...src import module

from ..src import module

两个都给我:

ValueError: Attempted relative import in non-package

【问题讨论】:

  • 摩尔细节!例如,导入语句的外观以及您遇到的错误。

标签: python pythonpath


【解决方案1】:

对于初学者,我建议阅读文档中的 Modifying Python's Search Path 条目。

有些人可能不赞成,但如果您想在程序中修改 PYTHONPATH,根据文档的 standard modules 条目,您可以使用 sys.path.append 方法:

import sys
sys.path.append('..')
import module

【讨论】:

  • 这行得通。我希望有一些更优雅的东西——比如创建一个包的方式——但现在这行得通。
【解决方案2】:

您不能使用PEP 328 来解决这个问题吗?

【讨论】:

  • 这看起来很有希望。明天我将不得不玩弄它,让你知道它是怎么回事。
  • 你能看看我的最新编辑吗?我似乎仍然收到 ValueError
  • 刚刚意识到我正在使用 IronPython。不确定这是否适用于 IPy。
  • 这里的愚蠢问题,您是在这些目录中创建__init__.py 还是__init.py
【解决方案3】:

如果你直接运行program.py,使用python program.py#!,那么module.py 的目录应该在PYTHONPATH 中,import module 才能工作。这可以使用保存在programDir 中的辅助 shell 脚本来实现,例如:

#!/bin/bash

script_dir=`dirname $0`
# Add the script's parent directory to the PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$script_dir/..

python $script_dir/program.py

另一种可能更好的方法是让program.py 导出“main()”函数,并在src/program 创建一个辅助python 脚本,如下所示:

#!/usr/bin/env python
from programDir.program import main
main()

在这种情况下,您可以src/programDir/program.py 中使用相对导入,因此应该可以:

from .. import module

【讨论】:

  • 你的意思是 src/programDir 吗?我不确定我是否理解这一点。
【解决方案4】:

第一个有效,因为 Python 的 sys.path 的第一个条目是 '',这意味着它将在您执行 Python 解释器的当前工作目录中查找模块名称。

您似乎遇到的问题是位于 src 的目录未在您的 PYTHONPATH 上设置。所以,你可以做的是显式设置 PYTHONPATH 环境变量。

这是一个使用 bash 的示例:

export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH}

然后正常运行你的程序

另一种方法是,您可以通过在程序执行时附加到 sys.path 来显式设置它。

因此,在您的 program.py 中,您将拥有:

if __name__ == '__main__':
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    your_main_function()

最后,对于认真的 Python 开发,您应该考虑 virtualenvvirtualenvwrapper,因为它会为您处理大部分这些事情。

【讨论】:

    【解决方案5】:

    您需要将__init__.py 添加到/programDir 以将目录解释为一个包。一旦一个包,你可以导入包的内容。

    因此,在您的情况下,如果 /srcPYTHONPATH 上,则可以从 module.py 导入 program.pyfrom programDir import program

    【讨论】:

    • 但我想这样做是相反的。我想从程序中导入模块。所以在program.py中,我正在尝试做“导入模块”
    • 如果/srcPYTHONPATH 中,您可以使用import module。如果没有,请添加__init__.py,您可以从program.py 进行相对导入:from .. import module
    【解决方案6】:

    如果你使用程序作为包的一部分,在另一个python模块中,比如

    import src.programDir.program as p
    
    p.some_method()
    

    你可以在 program.py 中使用相对导入,假设你正在创建一个带有 src 的包(__init__.py 在 src 和 programDir 中)

    from .. import module
    

    如果不是,例如您从命令行调用 program.py,则必须在导入前通过修改 sys.path 或 PYTHONPATH env var 将包含 src 的目录添加到搜索路径。

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 2018-04-04
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多