相对路径即使有__init__.py文件也无法工作

23

我知道stackoverflow上有很多类似的问题。但是常见的答案似乎对我不起作用。

我的文件结构如下:

  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个回答

28

1
那么IDE呢?它们不会知道像这样动态插入的模块。对于Python导入来说真是一团糟。 - WestCoastProjects

3

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

以下方法可能适用于您:

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

然而,最好的方法可能是在已经将lib包添加到路径中的上下文中运行代码。比如从“proj”目录中运行。


2

我曾经遇到过类似的问题,这是我的建议。

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

并且使用绝对导入。


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。它强烈建议您增加一个额外的目录级别,所以你可以使用my_proj.lib.aa代替lib.aa


0

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接