ImportError与同一目录中的模块

时间:2016-08-26 22:52:51

标签: python

我正在尝试测试一个python程序调用其他文件中定义的python函数的机制。例如,主程序是run.py

import os
import shutil
import ae.autoencoder
if __name__ == '__main__':
     main()

调用位于autoencoder.py子目录下的ae

autoencoer.py是

import data.py
# import data

但是,import data.pyimport data始终会显示以下错误消息

python run.py
Traceback (most recent call last):
 File "run.py", line 3, in <module>
  import ae.autoencoder
 File "/home/autoencoder/ae/autoencoder.py", line 1, in <module>
  import data.py
 ImportError: No module named 'data'

文件结构如下:(/ home / autoencoder是工作目录,run.py位于其中)

enter image description here

2 个答案:

答案 0 :(得分:0)

即使您从同一文件夹中的模块data导入模块autoencoder,也可能无法正常工作,因为搜索模块的路径始终是包含第一个被执行的文件,所以在你的情况下是run.py的路径。 autoencoderdata都位于ae子目录中。

您从autoencoder导出了run.pyimport ae.autoencoder

您可以采用相同的方式导入data:导入ae.data因为它仍然引用run.py的路径,因此您必须输入ae目录。

如果您想避免一直提到该文件夹​​,可以将ae目录添加到系统路径中。

打开run.py,然后您需要已导入的模块os,还需要导入sys模块,

然后:

sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "./ae")

因此 run.py 文件应如下所示:

import os
import shutil
import sys
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "./ae")
import autoencoder
def main():
    pass

if __name__ == "__main__":
    main()

您的 autoencoder.py 应如下所示:

import data

如果您使用IDE并尝试使用sys.path.append方法,则可能会显示IDE找不到模块autoencoderdata,但实际上找到了它们在包含路径后的运行时,它应该运行。

加载位于同一目录中的模块的另一种方法是:

from . import module_name

当您需要在运行时导入许多模块或导入模块时,建议使用 imp (现已弃用)或 importlib 模块。

对于Python 3.5 +:

import importlib.util
spec = importlib.util.spec_from_file_location("module_name", "/path/to/file")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

对于Python 3.3和3.4:

from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("module_name", "/path/to/file").load_module()
foo.MyClass()

对于Python 2:

import imp

foo = imp.load_source('module_name', '/path/to/file')
foo.MyClass()

答案 1 :(得分:0)

首先,在导入时无需添加.py扩展名。这是隐含的。

相对导入的语法(在同一目录中导入模块)在Python版本2和3之间变得更加严格。你设置它的方式将适用于Python 2.x,但我猜你是运行Python 3.x(您可以通过运行python --version来检查)。使用Python 3,您需要显式使用点来进行相对导入。

Python 2相对导入:

import data

更好的Python 2.5+相对导入:

from . import data

你应该在你编写的任何代码中使用第二个版本,除非你特别限制使用古老的python版本。