无法从包中导入python模块

时间:2018-05-04 16:04:10

标签: python import package

我的项目路径如下:

main.py
modules/
     __init__.py
     databaseManager.py
     sync.py
     excel.py
在main.py中

from modules.databaseManger import addExcelToDb, searchInDbAll
from modules.excel import search, showExcelDirContents
from modules.sync import syncExcelAndDB

,例如在database.py中:

from modules.excel import showExcelDirContents
from modules.sync import insertExcelNameToSyncDb

但是当我运行main.py时出现此错误:

Traceback (most recent call last):
 File "main.py", line 6, in <module>
   from modules.databaseManger import searchIn
ImportError: cannot import name 'searchInDbAll'

并且在尝试将模块目录中的每个文件中的函数导入其他文件时也出错。

我需要import的一些例子。

2 个答案:

答案 0 :(得分:0)

您可以附加到您放置模块的路径:

import sys
sys.path.append('modules/')

import sys
sys.path.append('c:/mycode/stuff/modules/')

注意这些是正斜杠,或者您可以使用双反斜杠,例如\\

然后将/ databaseManger.py文件放在/ modules

您还需要在名为的

__init__.py

这只是一个空文件

然后你应该能够做到:

from databaseManger import addExcelToDb, searchInDbAll

答案 1 :(得分:0)

这是循环导入问题。

<强>解释

首先触发导入databaseManager模块。

在此databaseManager代码开始导入excel

excel导入期间,excel代码尝试从searchInDbAll()检索函数databaseManager。但是那时候这个函数不存在 - 因为databaseManager正在导入excel并且他还没有开始定义任何函数。

如何解决:

在存在循环导入冲突的模块中,导入模块而不是函数。例如,更改此:

from modules.excel import showExcelDirContents

到那个:

from modules import excel

当然,您必须更改相应的函数调用,从showExcelDirContents()excel.showExcelDirContents()

您必须在databaseMangerexcelsync模块中执行此操作。通过此修复,我实际上可以运行您的代码。

是的,删除附加到sys.path,这是错误的