关于python:从其他文件夹导入模块时发生导入错误

ImportError while importing module from another folder

本问题已经有最佳答案,请猛点这里访问。

我有以下文件夹结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
controller/
    __init__.py
    reactive/
        __init__.py
        control.py
pos/
    __init__.py
    devices/
        __init__.py
        cash/
            __init__.py
            server/
                __init__.py
                my_server.py
    dispatcher/
        __init__.py
        dispatcherctrl.py

我需要在my_server.py中导入模块control.py,但它说ImportError: No module named controller.reactive.control,尽管我在所有文件夹中添加了__init__.py,在my_server.py中添加了sys.path.append('/home/other/folder/controller/reactive')

主文件在my_server.py中。

我不明白为什么,因为dispatcherctrl.py做同样的导入,而且工作正常。


在Python 3中

可以使用importlib.machinery模块为导入创建命名空间和绝对路径:

1
2
3
4
5
6
import importlib.machinery

loader = importlib.machinery.SourceFileLoader('control', '/full/path/controller/reactive/control.py')
control = loader.load_module('control')

control.someFunction(parameters, here)

这个方法可以用来导入任何文件夹结构中你想要的东西(向后,递归-不重要,我在这里使用绝对路径只是为了确定)。

Python 2

感谢塞巴斯蒂安为Python2提供了类似的答案:

1
2
3
4
import imp

control = imp.load_source('module.name', '/path/to/controller/reactive/control.py')
control.someFunction(parameters, here)

跨版本方式

您还可以执行以下操作:

1
2
3
4
5
import sys
sys.path.insert(0, '/full/path/controller')

from reactive import control # <-- Requires control to be defined in __init__.py
                                                # it is not enough that there is a file called control.py!

重要!将您的路径插入到EDOCX1的开头(0)可以正常工作,但是如果您的路径包含任何与Python内置函数冲突的内容,那么您将破坏这些内置函数,这可能会导致各种问题。在那里,尽量使用导入机制,并回归到事物的跨版本方式。