我有以下目录结构
outdir
|--lib
|--- __init__.py
|--- abc.py
|--indir
|--- __init__.py
|---- import_abc.py
如何在lib
中导入import_abc.py
?
当我尝试在import_abc.py
中导入lib时我收到以下错误
Traceback (most recent call last):
File "import_abc.py", line 1, in <module>
import lib
ImportError: No module named lib
答案 0 :(得分:3)
花点时间看看你想要实现的目标:你想要导入 模块abc.py是包lib的一部分,所以为了正确导入它,你需要指定它在哪个包中:
from lib import abc
或
import lib.abc as my_import
在旁注中,请查看the Python Tutorial chapter on modules。
鉴于@Noelkd的评论,我忘了告诉你PYTHONPATH这是一个环境变量,它包含Python将寻找模块的文件夹(如Java CLASSPATH)。您需要将根文件夹放在PYTHONPATH中,以避免使用sys.path.append进行一些调整。
在Bash中:
export PYTHONPATH=<abs. path to outdir>
例如,我已将outdir放入桌面:
export PYTHONPATH=~/Desktop/outdir
进口就像魅力一样。
您可以在this blog post中找到有关导入机制和PYTHONPATH的一些很好的解释。
N.B。:如果您使用的是IDE(例如PyDev),通常会为每个项目自动设置PYTHONPATH。但如果您想自己完成所有操作,则需要设置PYTHONPATH环境变量。
答案 1 :(得分:2)
在__init__.py
中添加outdir
文件,然后执行:
#import_abc.py
import sys
sys.path.append('/home/monty/py') #path to directory that contains outdir
from outdir.lib import abc
答案 2 :(得分:2)
我遇到过类似的问题。一般有两种导入模块的方法。一个是绝对路径,另一个是相对路径。
对于绝对路径,python使用sys.path
来解析路径,如上面的答案所示。但我个人不喜欢操纵sys.path
。
对于相对路径,python使用__name__
解析路径。假设模块的__name__
为package1.package2.module3
,而模块3使用from ..packge3 import module4
在上层包中导入模块。 Python会将它们组合起来以获得package1.packge3.module4
。详细信息已在this帖子中说明。
我的解决方案是添加/outside
目录作为/outdir
的父目录,并通过在outdir
下添加__init__.py
将/outdir
作为一个包。
然后,您可以在from ..lib.abc import cls
文件中添加import_abc.py
。相对路径应该有效
答案 3 :(得分:1)
import sys
sys.path.append('../lib')
import abc