我知道堆栈溢出有很多类似的问题。但是,通常的答案对我来说似乎没有用。
我有像这样的文件结构
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
个文件,还是查看了我的包层次结构?
答案 0 :(得分:17)
你需要更新你的sys.path
,这是python查找模块的地方,而不是当前环境中系统的路径,这是os.environ["PATH"]
所指的。
示例:
import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa
完成此操作后,您可以使用aa
中的功能:aa.myfunc()
答案 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