从嵌套文件夹导入模块

6
我有这样的一个文件夹结构:
main_folder
|
|--done
|  |
|  |--test1
|  |--__init__.py
|
|---check.py

__init__.py:

class Tries(object):
    def __init__(self):
        print "Test"

check.py:

from done.test1 import Tries
Tries()

错误:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-8-10953298e1df> in <module>()
----> 1 from done.test1 import Tries

ImportError: No module named done.test1 

我无法从嵌套文件夹中导入模块。有没有什么办法可以做到这一点。

编辑:

在Salva的回答之后,我更改了我的结构如下:

.
├── check.py
|--__init__.py(no content)
└── done
    ├── __init__.py(no content)
    └── test1
        └── __init__.py <-- this files contains your Tries class

现在也会抛出相同的错误。

3个回答

8

您需要在每个要被视为包的目录中都有一个名为__init__.py的文件,因此您需要在两个目录中都有它:

.
├── check.py
└── done
    ├── __init__.py
    └── test1
        └── __init__.py <-- this files contains your Tries class

你的目录中有*.pyc文件吗?尝试删除它们。 - Salva

1
在下面的文件/文件夹结构中,你的代码可以正常工作:
.
├── check.py
└── done
    └── test1.py

当我运行check.py时,它会打印出“Test”。我没有使用__init__.py。你所描述的__init__.py我用test1.py代替了。

我在Spyder中进行了测试,也许它在后台处理了一些东西? - Lam

1
请先尝试导入 done 包。
import done

如果它不能正常工作,可能是因为您运行的脚本与您指定的文件夹(在这种情况下为main_folder)不同。
从日志中看来,似乎您正在使用IPython,在这种情况下,请尝试将您的文件夹添加为模块路径。
import sys
sys.path.append('path/to/your/main_folder')
import done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接