代码之家  ›  专栏  ›  技术社区  ›  fabda01

在项目目录外导入函数的最佳方法

  •  2
  • fabda01  · 技术社区  · 6 年前

    .
    └── mylib
        ├── __init__.py
        ├── fun1.py
        ├── fun2.py
        └── test.py
    

    假设 test.py 从模块导入函数 fun1.py fun2.py ,所以它包含

    from fun1 import funA
    from fun2 import funB
    

    测试.py

    ModuleNotFoundError: No module named 'fun1'
    

    我可以通过指定 我的进口货。

    from mylib.fun1 import funA
    from mylib.fun2 import funB
    

    再说一遍,假设我不必只进口 funA() funB +除了 它还从彼此导入函数。因此,为每个导入指定路径需要花费大量时间(这样做的导入超过200个)。

    除了指定所有导入的整个路径之外,是否有更干净的方法来生成这些导入?

    __init__.py ,但由于经验不足,我还是无法成功。

    文件夹

    功能1.py

    def funA():
        return True
    

    from fun1 import funA
    
    def funB():
        return True
    

    测试.py

    从fun1导入funA
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   bjschoenfeld    6 年前

    如果我理解正确,您希望在mylib之外有一个看起来像

    from mylib import funA
    

    首先,似乎您需要mylib中所有的相对导入。其次,您需要使用您的初始化py从本地目录导入所有内容,并使其在上面的目录中可用。我将(最少)更改您的文件如下,添加更多的文件来测试导入。

    目录结构:

    .
    ├── mylib
    │   ├── fun1.py
    │   ├── fun2.py
    │   ├── __init__.py
    │   └── test.py
    ├── scriptA.py
    ├── scriptB.py
    └── script_test.py
    

    功能2.py

    from .fun1 import funA
    
    def funB():
        return True
    

    __初始年

    from .fun1 import funA
    from .fun2 import funB
    

    from . import funA, funB
    

    脚本.py

    脚本b.py

    from mylib import funB
    

    from mylib import test
    
    test.funA()
    

    现在可以根据需要使用脚本A、B或U测试。当您继续使用 . 在每个目录级别的初始化中。

        2
  •  0
  •   PerunSS    6 年前

    您需要在需要的地方导入模块/函数。python无法神奇地知道您已经导入了某些内容。有不同的方法导入所需的模块/功能( https://docs.python.org/3/reference/import.html

    from . import func1
    from . import func2
    
    def test():
        func1.funA()
        func2.funB()
    

    只是个例子。但你可以看到一个大致的想法。( from . import func1 将从当前目录/模块导入func1)

        3
  •  -1
  •   P Raju    6 年前

    根据我的理解,您正在尝试导入位于其他项目位置的模块。尝试此操作,并将路径替换为要从中导入模块的位置。

    sys.path.insert(0, path)
    

    如果我误解了你的问题,请告诉我。