将子模块中的模块导入父级

时间:2017-01-23 11:49:40

标签: python python-import python-module pythonpath

所以我看了这里提到的各种类似的问题,但到目前为止没有什么对我有用。

我有以下文件架构:

\folder
    __init__.py
    supClass.py
    script1.py
    \sub
        __init__.py
        script2.py

所以在script2.py中我尝试导入supClass。如果我理解我在相关主题上所阅读的内容,我必须指明\folder是PYTHONPATH的一部分。

以下是我读过的例子,我最终得到了这段代码:

if __name__ == '__main__' and __package__ is None:
    from os import sys, path
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))

from test_package import supClass

    a = supClass()
    a.print_sup()

但是我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
    execfile(filename, namespace)
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 71, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)
  File "C:/Donnees/Programmes_Python/Developpement/Tests/test_package/sub/script.py", line 18, in <module>
    from test_package import supClass
ImportError: No module named test_package

我通过

检查了\文件夹现在是PYTHONPATH的一部分
import sys
print sys.path

在我的控制台中,没关系。但是,__package__变量保持设置为无。

我得到的错误似乎表明我的\folder不是模块。我不明白为什么,也许我在“包”和“模块”之间混淆了一些东西。

无论如何,如果有人有想法,那就非常感激了!

3 个答案:

答案 0 :(得分:1)

\folder应该在PYTHONPATH上。然后你可以做

from folder import subClass 

from folder.sub import script2

folder应该在PYTHONPATH(而不是folder本身)的原因是因为folder是你的包,并且import folder Python需要查看包含 folder的目录

请注意,从子文件夹执行脚本是有问题的,但如果您编写setup.py文件则很容易。有关详细信息,请参阅我的回答stackoverflow.com/a/41201868/75103。

答案 1 :(得分:0)

您是否尝试仅导入supClass?

import supClass

或试试这个:

sys.path.append("../")
import supClass

答案 2 :(得分:0)

我试图重现你的层次结构,这就是诀窍:

if __name__ == '__main__':
   from os import sys, path
   sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))

   from supClass import supClass
   a = supClass()
   a.print_sup()