我正在用python3x开发一个库,尝试导入所有模块,类和函数时遇到了一些麻烦。
/example.py
/math/
__init__.py
linalg.py
solve() #inside module.py
这里的问题是,我希望能够简单地将我的库导入example.py内,然后像numpy一样使用不同模块内定义的所有函数,例如:
import math as m
m.solve()
代替
import math as m
m.linalg.solve()
或
import math.linalg as m
m.solve()
我应该如何定义__init__.py使其包含所有内容。我试过使用dir(linalg),绝对导入等,因为我对此一无所知。
谢谢。
解决方案:
最后,我要做的是在它们之间创建一个包装层以隐藏模块依赖性。
在__init__.py内部:
from .linalg import *
from .wrappers import *
然后与linalg.py一起创建了wrappers.py:
from math.linalg import solve
def wrapper_solver():
{
solve()
}
,然后在example.py中:
import math as m
m.wrapper_solver()
希望它可以帮助某人。
答案 0 :(得分:2)
两种解决方案:
example.py
:
#!/usr/bin/env python3
import math.linalg as m # rather than just `import math`.
m.solve()
math/__init__.py
:
from linalg import solve
编辑:
您可以按照Muhammed Ajwahir的建议修改python路径。但以我的拙见,这并不能解决问题。这是导入路径的问题。默认情况下,根目录已添加到Python路径(执行./example.py
时)。这足以将所有内容导入子目录。我认为没有必要修改路径。
编辑2:
如果要导入__init__.py
中的所有内容,则也可以使用from math import *
(被视为bad practice)。或将所有内容手动添加到您的__init__.py
中。
但是在您的情况下,您可以考虑只重构树:
.
|-- example.py
|-- math.py
忘记了math
目录结构。这样,一个简单的import math
就足够了。
我还要指出,math
已经是Python中的现有库。我认为您应该考虑重命名以避免名称冲突。
答案 1 :(得分:0)
在linalg.py中,写__ all __
并写所有要公开给包的函数。
示例__ all __ =['solve']
然后在__ init __.py
(存在linalg.py文件的模块中)中写入文件from .linalg import *
,这将导入__ all __
中定义的所有函数
(请注意函数名称应该是唯一的)。
然后在__ init __.py
中写入__ all __ = linalg.__ all __
(如果还有更多文件,例如+
,则使用__ all __ = linalg.__ all __ +file2.__ all __
。
,然后在示例中,您可以将solve
称为from math import solve
。
答案 2 :(得分:-1)
如果要在文件夹中添加某些内容,则必须将该文件夹添加到系统目录中。您可以通过-
import sys
sys.path.insert(0, '/path/to/math/folder')
import linalg as m
m.solve()
编辑1:
OR
在__init__.py中, 添加
__all__ = ["linalg", "foo", "barr"]
etc,主脚本中的import math as m
希望有帮助。