2017-01-23 94 views
-1

所以我看了一下这里提到的各种类似的问题,但到目前为止我没有任何工作。从子文件夹导入模块到父项

我有以下文件结构:

\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不是一个模块。我不明白为什么,也许我在“包”和“模块”之间混淆了事物。

无论如何,如果有人有一个想法,它将不胜感激!

+1

'\ folder'的* parent *应该在'PYTHONPATH'上。假设'folder' =='test_package',然后你可以通过test_package import subClass和test_package.sub import script2来完成。请注意,从子文件夹执行脚本是有问题的(但如果您编写'setup.py'文件则很容易)。有关更多信息,请参阅我的答案http://stackoverflow.com/a/41201868/75103。 – thebjorn

+0

这个工程!谢谢!但是,你能解释为什么\文件夹的父母应该在PYTHONPATH上,而不仅仅是\文件夹本身? –

+1

由于'folder'是你的*包*,并且'import folder',因此Python需要查看包含*'文件夹'的目录。 – thebjorn

回答

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。

0

您是否尝试导入supClass?

import supClass 

或者试试这个:

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

'import supClass'不起作用,并且我得到了'No module named supClass'错误,我得到的supClass不在与script2相同的文件夹中,既不是PYTHONPATH的一部分。第二个选项导致相同的错误。我认为它和我的脚本一样。 –

+0

从wich目录执行python文件吗?写下你如何启动该程序。 – Wonka

+0

我直接从我的IDE启动程序,所以它应该从'\ sub'目录我猜。 –

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() 
+0

好吧,我试过了,确实有效!但我不明白为什么我不能导入directlty'test_package'。我想直接导入'test_package',以便我可以使用'__init __。py',它可以包含来自supClass import supClass语句的'' –

+0

__init__.py是一个包文件。你为什么要打电话? 看看这里的文档:https://docs.python.org/3/tutorial/modules.html#packages – al27091

+0

没有'__init __。py'不是supClass()类的构造函数。 supClass具有自己的构造函数(这是一种名为'__init__'的方法)。但'__init __。py'只是将文件夹定义为python包所需的初始化文件。 –