从子文件夹导入模块

时间:2012-01-21 14:44:23

标签: python import module subdirectory

我想将子文件夹导入为模块。因此,每个子文件夹都包含__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

6 个答案:

答案 0 :(得分:108)

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

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

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

或者您可以使用relative imports

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

答案 1 :(得分:17)

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

永远不要为了您自己的利益,使用空格或符号命名文件夹或文件,例如&#34; - &#34;或&#34; _&#34;。如果你这样做,你可能会面临一些问题。比如说,虽然您的导入命令是正确的,但您无法成功导入这些命名文件夹中可用的文件。

无效的文件夹命名如下:

  • 通用-类-文件夹
  • 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,我想导入&#39; targetClass.py&#39;在Generic-Class-Folder文件中使用名为&#34; functionExecute&#34;的函数。在&#39; targetClass.py&#39;文件

我做了什么命令?

  • 来自&#39; testFile.py&#39;,写了命令,   from Core.Generic-Class-Folder.targetClass import functionExecute
  • 收到SyntaxError: invalid syntax
  • 等错误

尝试了很多搜索并查看了许多stackoverflow问题,无法确定出错的地方。我多次交叉检查我的文件,我使用__init__.py文件,插入环境路径并非常担心出了什么问题......

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

(抱歉这个巨大的帖子......只是让我的挫折感...... :)谢谢!)

答案 2 :(得分:5)

设置PYTHONPATH环境变量。例如像PYTHONPATH =。:..(对于* nix系列)。

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

说您的项目的结构是这样的:

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

run.py内,您可以通过以下方式导入脚本一和二:

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)

答案 5 :(得分:-2)

即使子文件夹中存在 init .py,并且在导入后添加的所有内容都为“ as”时仍然存在问题

from folder.file import Class as Class
import folder.file as functions