我正在尝试测试一个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.py
或import 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位于其中)
答案 0 :(得分:0)
即使您从同一文件夹中的模块data
导入模块autoencoder
,也可能无法正常工作,因为搜索模块的路径始终是包含第一个被执行的文件,所以在你的情况下是run.py
的路径。 autoencoder
和data
都位于ae
子目录中。
您从autoencoder
导出了run.py
:import 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找不到模块autoencoder
和data
,但实际上找到了它们在包含路径后的运行时,它应该运行。
加载位于同一目录中的模块的另一种方法是:
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版本。