从子文件夹导入模块

我想导入子文件夹作为模块。因此每个子文件夹都包含一个 __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
202851 次浏览

设置你的 PYTHONPATH 环境变量,例如: pYTHONPATH = . : . . (For * nix family)。

你也可以手动添加你的工作目录(在你的例子中是 src)到 pythonpath:

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

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

为了在包中正确地使用绝对导入,还应该包括“根”包名,例如:

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

或者你可以使用 相对进口:

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

只是在这里通知。(来自一只新蜜蜂,keviv22)

为了你自己的利益,永远不要用“-”或“ _”这样的符号来命名文件夹或文件。如果你这样做了,你可能会面临一些问题。就像我的命令一样,虽然您的导入命令是正确的,但是您无法成功地导入在这些命名文件夹中可用的所需文件。

无效文件夹名称如下:

  • 泛型-类-文件夹
  • 泛型 _ 类 _ 文件夹

上述有效文件夹名称:

  • 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’文件中名为“ function tionExecute”的函数

我下了什么命令?

  • 来自‘ testFile.py’的命令, from Core.Generic-Class-Folder.targetClass import functionExecute
  • 有像 SyntaxError: invalid syntax这样的错误

尝试了许多搜索,查看了许多堆栈溢出问题,但无法确定哪里出错了。我交叉检查我的文件多次,我使用 __init__.py文件,插入环境路径和非常担心什么出错了..。

很久很久以后,我和一个朋友聊天的时候发现了这一点。我用这样的命名规则有点傻。我不应该使用空格或特殊符号来定义任何文件夹或文件的名称。这就是我想表达的。祝你今天愉快!

(对于这篇大文章我很抱歉... ... 只是让我的沮丧消失... ... :)谢谢!)

假设你的项目是这样结构的:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

run.py中,您可以通过以下方式导入脚本1和2:

from subscripts import script_one as One
from subscripts import script_two as Two

现在,仍然在 run.py中,您可以使用以下方法调用它们的方法:

One.method_from_one(param)
Two.method_from_two(other_param)

只需创建一个空的 __init__.py文件,并将其添加到 root 以及 Python 应用程序的所有子目录/文件夹中,其中包含其他 python 模块。见 https://docs.python.org/3/tutorial/modules.html#packages