3

我有以下目录结构

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
4

5 回答 5

3

花一点时间看看你想要实现什么:你想导入模块 abc.py 这是包 lib 的一部分,所以为了正确导入它,你需要指定它在哪个包中:

from lib import abc

或者

import lib.abc as my_import

另外,请查看Python 教程中关于模块的章节

鉴于@Noelkd 的评论,我忘了告诉你 PYTHONPATH 是一个环境变量,其中包含 Python 将在其中查找模块的文件夹(如 Java CLASSPATH)。您需要将根文件夹放在 PYTHONPATH 中,以避免对 sys.path.append 进行一些摆弄。

在 Bash 中:

export PYTHONPATH=<abs. path to outdir>

例如,我在我的桌面上放了 outdir:

export PYTHONPATH=~/Desktop/outdir

进口就像一个魅力。

您可以在这篇博文中找到有关导入机制和 PYTHONPATH 的一些很好的解释。

注意:如果您使用的是 IDE(例如 PyDev),通常它会为每个项目自动设置 PYTHONPATH。但是如果你想自己做这一切,你需要设置 PYTHONPATH 环境变量。

于 2013-07-28T14:55:16.477 回答
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
于 2013-07-28T14:57:54.003 回答
2

我遇到过类似的问题。导入模块一般有两种方式。一种是绝对路径,另一种是相对路径。

对于绝对路径,python 用于sys.path解析路径,如上述答案所建议的那样。但我个人不喜欢操纵sys.path

对于相对路径,python 使用__name__解析路径。假设一个模块有__name__aspackage1.package2.module3和 module3 在上层包中导入模块,使用from ..packge3 import module4. Python 会将它们结合起来得到package1.packge3.module4. 详细信息已在这篇文章中说明。

我的解决方案是添加一个/outside目录作为父目录,/outdiroutdir通过__init__.py/outdir.

然后你可以添加文件from ..lib.abc import clsimport_abc.py相对路径应该有效

于 2015-10-26T16:00:36.343 回答
1
import sys
sys.path.append('../lib')
import abc
于 2013-07-28T15:02:34.407 回答
0

您也可以将父outdir目录设置为模块添加__init__.py到它:

outdir
     |-- __init__.py
     |-- lib
            |-- __init__.py
            |-- abc.py
     |-- indir
            |-- __init__.py
            |-- import_abc.py

然后,如果添加路径,import_abc.py您将能够导入:liboutdir

#In import_abc.py

import sys
sys.path.append('../outdir')
import lib.abc
于 2021-11-02T19:43:08.690 回答