从子文件夹导入模块
我想要导入子文件夹作为模块。 因此每个子文件夹都包含一个__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
这里没有必要弄乱你的PYTHONPATH
或sys.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…只是让我的挫折去… :)谢谢!)