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

时间:2018-08-13 21:00:03

标签: python

我的项目具有以下结构:

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

假设test.py从模块fun1.pyfun2.py导入函数,因此它包含

from fun1 import funA
from fun2 import funB

但是,当我尝试将test.py导入项目目录之外时,出现以下错误:

ModuleNotFoundError: No module named 'fun1'

我可以通过在导入中指定fun1.pyfun2.py的完整路径来解决此问题。

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

但是,再次,假设我不必仅导入funA()funB,除了test.py以外,我还有一大堆模块,它们也可以相互导入函数。因此,为每个导入指定路径(要进行200多次这样的导入)会花费大量时间。

除了为所有导入指定完整路径之外,还有没有更清洁的方法来进行这些导入?

我尝试在__init__.py上进行这些导入,但是由于我的经验不足,我仍然无法使其工作。

文件

fun1.py

def funA():
    return True

fun2.py

from fun1 import funA

def funB():
    return True

test.py

from fun1 import funA
from fun2 import funB

3 个答案:

答案 0 :(得分:1)

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

的文件
from mylib import funA

首先,似乎您在mylib中到处都需要相对导入。其次,您需要使用__init__.py从本地目录中导入所有内容,并使其在上面的目录中可用。我将(至少)更改文件,如下所示,添加更多文件以测试导入。

目录结构:

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

fun2.py

from .fun1 import funA

def funB():
    return True

__ init __。py

from .fun1 import funA
from .fun2 import funB

test.py

from . import funA, funB

scriptA.py

from mylib import funA

scriptB.py

from mylib import funB

script_test.py

from mylib import test

test.funA()

您现在可以根据需要使用脚本A,B或_test。当您继续在每个目录级别使用__init__.py中的.相对导入时,此模式将扩展到更深的目录结构。

答案 1 :(得分:0)

您需要在需要的位置导入模块/功能。 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)

答案 2 :(得分:-1)

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

sys.path.insert(0, path)

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