python中的库导入结构

时间:2019-02-06 11:28:49

标签: python python-3.x python-import

我正在用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()

希望它可以帮助某人。

3 个答案:

答案 0 :(得分:2)

两种解决方案:

  1. 将整个路径导入linalg.py:

example.py

#!/usr/bin/env python3                                                         

import math.linalg as m # rather than just `import math`.

m.solve()
  1. 使用__init __。py 可以直接从数学中求解:

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 希望有帮助。