即使使用__init__.py,相对路径也不起作用

时间:2012-02-24 07:35:28

标签: python import package python-import importerror

我知道堆栈溢出有很多类似的问题。但是,通常的答案对我来说似乎没有用。

我有像这样的文件结构

  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个文件,还是查看了我的包层次结构?

6 个答案:

答案 0 :(得分:17)

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

示例:

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

完成此操作后,您可以使用aa中的功能:aa.myfunc()

accepted answer python: import a module from a directory

中有更多信息

答案 1 :(得分:2)

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

这可能适合你:

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

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

答案 2 :(得分:1)

您尝试从中导入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强烈建议您添加一个额外级别的目录,而不是lib.aa,而是将其称为my_proj.lib.aa

答案 3 :(得分:1)

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

不要更改sys.path,而是更好地运行test.py,使其位于proj(即项目根目录)目录中。这样项目目录将自动进入sys.path,您就可以导入lib包。

并使用绝对导入。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

在 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
相关问题