从子文件夹导入模块

Raz*_*zer 89 python import module subdirectory

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

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py
Run Code Online (Sandbox Code Playgroud)

在我的主脚本中我导入

from dirFoo.foofactory import FooFactory
Run Code Online (Sandbox Code Playgroud)

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

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2
Run Code Online (Sandbox Code Playgroud)

如果我调用我的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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ers 116

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

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

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2
Run Code Online (Sandbox Code Playgroud)

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

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
Run Code Online (Sandbox Code Playgroud)

  • 有一点需要记住!将`__init __.py`添加到要导入的每个子文件夹中. (42认同)
  • 空`__init __.py`可以完成这项工作. (6认同)
  • 如果以前“Foo1”位于父目录中并且编码为“from Foo1 import *”,那么语法会是什么。有没有办法达到同样的效果,这样你就不必在所有内容前面加上“Foo1”前缀? (2认同)

Viv*_*k22 20

只是在这里通知.(来自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
Run Code Online (Sandbox Code Playgroud)

我想做什么?

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

我做了什么命令?

  • 来自'testFile.py',写命令,来自Core.Generic-Class-Folder.targetClass导入functionExecute
  • 出现"SyntaxError:invalid syntax"之类的错误

尝试了很多搜索并查看了许多stackoverflow问题,无法确定出现了什么问题.我多次交叉检查我的文件,我使用from Core.Generic-Class-Folder.targetClass import functionExecute文件,插入环境路径,并非常担心出了什么问题......

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

(对不起这个巨大的帖子...只是让我的挫折去.... :)谢谢!)

  • 空格和短划线(" - ")会导致这种情况,但下划线("_")仍应正常工作. (14认同)

Fla*_*che 6

假设您的项目是这样构建的:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py
Run Code Online (Sandbox Code Playgroud)

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

from subscripts import script_one as One
from subscripts import script_two as Two
Run Code Online (Sandbox Code Playgroud)

现在,仍然在里面run.py,您将能够使用以下命令调用他们的方法:

One.method_from_one(param)
Two.method_from_two(other_param)
Run Code Online (Sandbox Code Playgroud)


Max*_*kov 5

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

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

import os
import sys
sys.path.insert(0, os.getcwd())
Run Code Online (Sandbox Code Playgroud)