从子文件夹导入模块

我想要导入子文件夹作为模块。 因此每个子文件夹都包含一个__init__.py 。 我的文件夹结构是这样的:

 src\ main.py dirFoo\ __init__.py foofactory.py dirFoo1\ __init__.py foo1.py dirFoo2\ __init__.py foo2.py 

在我的主要脚本中,我导入

 from dirFoo.foofactory import FooFactory 

在这个工厂文件中我包含了子模块:

 from dirFoo1.foo1 import Foo1 from dirFoo2.foo2 import Foo2 

如果我打电话给我foofactory我得到的错误,python不能导入子模块foo1和foo2:

 Traceback (most recent call last): File "/Users/tmp/src/main.py", line 1, in <module> from dirFoo.foofactory import FooFactory File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module> from dirFoo1.foo1 import Foo1 ImportError: No module named dirFoo1.foo1 

这里没有必要弄乱你的PYTHONPATHsys.path

要在包中正确使用绝对导入,您还应该包含“root”包名,例如:

 from dirFoo.dirFoo1.foo1 import Foo1 from dirFoo.dirFoo2.foo2 import Foo2 

或者你可以使用相对导入 :

 from .dirfoo1.foo1 import Foo1 from .dirfoo1.foo1 import Foo2 

设置你的PYTHONPATH环境variables。 比如像这样的PYTHONPATH =。:(对于* nix系列)。

你也可以手动添加你的当前目录(在你的情况下src)pythonpath:

 import os import sys sys.path.insert(0, os.getcwd()) 

只是在这里通知。 (来自newbee,keviv22)

为了自己的利益,永远不要为文件夹或文件命名空格或符号,如“ – ”或“_”。 如果你这样做,你可能会遇到一些问题。 像我的,说,虽然你的导入命令是正确的,你将无法成功地导入这些命名文件夹内可用的所需文件。

无效的文件夹命名如下:

  • 仿制类,文件夹
  • Generic_Classes_Folder

以上有效的文件夹命名:

  • GenericClassesFolder或GenericClassesfolder或genericClassesFolder(或者像这样,没有任何空格或单词中的特殊符号)

我做了什么错误:

考虑文件结构。

 Parent . __init__.py . Setup .. __init__.py .. Generic-Class-Folder ... __init__.py ... targetClass.py . Check .. __init__.py .. testFile.py 

我想要做什么?

  • 我想从testFile.py中导入Generic-Class-Folder文件中的'targetClass.py'文件,以在'targetClass.py'文件中使用名为“functionExecute”的函数

我做了什么命令?

  • 从'testFile.py',写入命令,从Core.Generic-Class-Folder.targetClass import functionExecute
  • 得到的错误,如“SyntaxError:无效的语法”

尝试了许多search,并查看了很多stackoverflow的问题,无法确定哪里出了问题。 我多次交叉检查我的文件,我用__init__.py文件,插入环境path,并非常担心出了什么问题……

经过很长很长的一段时间,我在和一位朋友交谈的时候想到了这一点。 我有点愚蠢的使用这种命名约定。 我不应该使用空格或特殊符号来为任何文件夹或文件定义名称。 所以,这是我想传达的。 祝你有美好的一天!

(对不起,这个巨大的post…只是让我的挫折去… :)谢谢!)