【问题标题】:relative path not working even with __init__.py即使使用 __init__.py 相对路径也不起作用
【发布时间】:2012-03-14 16:24:57
【问题描述】:

我知道堆栈溢出有很多类似的问题。但常见的答案似乎对我不起作用。

我有这样的文件结构

  proj/
       lib/
          __init__.py
          aa.py
          bb.py
          test/
               __init__.py
               aa_test.py

我想如果我在 test.py 中包含代码

import lib.aa

from lib import aa

我将能够引用lib/ 目录中的模块。但这不起作用。

所以我尝试添加到路径,它正确地添加了它:

os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..",""))
print os.environ["PATH"]

但即使是现在,当我尝试上面的导入语句时......我仍然收到错误

ImportError: No module named aa

ImportError: Importing from non-package <Something...>

我有什么明显的遗漏吗?

有没有办法检查我是否正确配置了我的__init__.py 文件,或者查看我的包层次结构?

【问题讨论】:

    标签: python import package python-import importerror


    【解决方案1】:

    lib 目录需要在您的 python 模块搜索路径中,这与您的 shell 使用的搜索路径不同。

    这可能对你有用:

    import sys, os
    sys.path.append(os.path.abspath(".."))
    

    但是,从 lib 包已经在路径上的上下文中运行代码可能会更好。比如来自“proj”目录。

    【讨论】:

      【解决方案2】:

      您尝试从中导入 lib.aa 的代码在哪里?我猜 /proj/ 不是你的工作目录,它需要像现在设置的那样。您可能希望将目录添加到 PYTHONPATH 而不是 PATH,以便它出现在导入的搜索路径中。见http://docs.python.org/tutorial/modules.html#the-module-search-path

      另外,请查看http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html 它强烈建议您放置一个额外级别的目录,因此您可以将其称为my_proj.lib.aa,而不是lib.aa

      【讨论】:

        【解决方案3】:

        你需要更新你的sys.path,这是python查找模块的地方,而不是你系统在当前环境中的路径,这是os.environ["PATH"]所指的。

        例子:

        import os, sys
        sys.path.insert(0, os.path.abspath(".."))
        import aa
        

        完成此操作后,您可以像这样使用aa 中的函数:aa.myfunc()

        accepted answerpython: import a module from a directory 中有更多信息

        【讨论】:

        • IDE 怎么样?他们不会知道像这样动态插入的模块。 python 进口真是一团糟
        【解决方案4】:

        python 导入语句不使用系统 PATH 变量。它使用 PYTHONPATH,但添加新目录以导入搜索路径的最佳方法是修改 sys.path。

        如果这没有帮助,请将 sys.path 的值和 os.getcwd() 返回的值添加到问题中。

        【讨论】:

          【解决方案5】:

          我有类似的问题,这是我的建议。

          与其更改sys.path,不如从proj(即项目根目录)目录中运行您的test.py。这样项目目录将自动在sys.path 中,您将能够导入lib 包。

          并使用绝对导入。

          【讨论】:

            【解决方案6】:

            在 Sublime Text 3 中,abspath 对我不起作用。 我在顶部的“__ init __.py”文件中使用它

            希望它对你有用。

            from os.path import dirname
            from sys import path
            
            path.insert( 0 , dirname( __file__ ) ) ;
            
            from test import aa_test
            

            【讨论】:

              猜你喜欢
              • 2021-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多