【问题标题】:Importing modules from nested folder [duplicate]从嵌套文件夹导入模块[重复]
【发布时间】:2016-05-18 00:23:34
【问题描述】:

我有这样的文件夹结构

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 

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

编辑:

在萨尔瓦的回答之后,我改变了这样的结构

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

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

【问题讨论】:

    标签: python python-2.7 import


    【解决方案1】:

    您需要在每个目录中都有一个文件 __init__.py,您希望它被视为一个包,因此您需要在 both 目录中使用它:

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

    【讨论】:

    • 您的层次结构中有 *.pyc 文件吗?尝试删除它们。
    【解决方案2】:

    在以下文件/文件夹结构中,您的代码只适用于此处:

    .
    ├── check.py
    └── done
        └── test1.py
    

    当我运行 check.py 时,它会打印 Test。不过我没有使用 __init__.py 。你所说的 __init__.py 我做了 test1.py。

    【讨论】:

    • 我在 Spyder 中测试过,也许它在后台处理了一些东西?
    【解决方案3】:

    先尝试导入包done

    import done
    

    如果它不起作用,可能是您从与指定文件夹不同的文件夹运行脚本(在本例中为 main_folder

    从日志看来您正在使用 IPython,在这种情况下尝试将您的文件夹添加为模块路径

    import sys
    sys.path.append('path/to/your/main_folder')
    import done
    

    【讨论】:

      猜你喜欢
      • 2022-10-16
      • 1970-01-01
      • 2013-08-26
      • 2019-09-16
      • 2012-02-15
      相关资源
      最近更新 更多