我的项目具有以下结构:
.
└── mylib
├── __init__.py
├── fun1.py
├── fun2.py
└── test.py
假设test.py
从模块fun1.py
和fun2.py
导入函数,因此它包含
from fun1 import funA
from fun2 import funB
但是,当我尝试将test.py
导入项目目录之外时,出现以下错误:
ModuleNotFoundError: No module named 'fun1'
我可以通过在导入中指定fun1.py
和fun2.py
的完整路径来解决此问题。
from mylib.fun1 import funA
from mylib.fun2 import funB
但是,再次,假设我不必仅导入funA()
和funB
,除了test.py
以外,我还有一大堆模块,它们也可以相互导入函数。因此,为每个导入指定路径(要进行200多次这样的导入)会花费大量时间。
除了为所有导入指定完整路径之外,还有没有更清洁的方法来进行这些导入?
我尝试在__init__.py
上进行这些导入,但是由于我的经验不足,我仍然无法使其工作。
def funA():
return True
from fun1 import funA
def funB():
return True
from fun1 import funA
from fun2 import funB
答案 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
from .fun1 import funA
def funB():
return True
from .fun1 import funA
from .fun2 import funB
from . import funA, funB
from mylib import funA
from mylib import funB
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)
如果我误解了你的问题,请告诉我。