如何声明子包,以使其与环境中的父包不冲突?

时间:2019-05-29 13:25:17

标签: python

本地软件包将屏蔽环境中其他任何具有相同名称的软件包。

复制步骤:

mkdir pandas
touch pandas/__init__.py
python
>>> from pandas import DataFrame
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name DataFrame

如果我cd进入另一个目录,则可以导入,因此很明显我的包掩盖了父目录。

我用pandas.DataFrame举例说明了我的观点。我真正想做的是在同一包中创建模块的层次结构。但是我的某些模块已经安装了pip,如果我尝试正确打包新模块,即使用相同的软件包名称,则会失去对我环境中已经安装的那些模块的访问权限。

我想将每个模块保存在单独的项目/ git存储库中。

PS:我来自java

1 个答案:

答案 0 :(得分:0)

您可以对本地软件包使用.表示法,如下所示:

from .pandas import DataFrame

通过避免混淆的方法,最好避免使用与numpypandas等知名软件包相同的名称。否则,您可以这样做

from mycompany.pandas import DataFrame

您具有以下软件包结构:

mycompany/
__init__.py
pandas/
__init__.py

所以要避免软件包名称在根软件包级别重叠。

如果您使用的是类似包的结构

mycompany/
__init__.py
tests/
__init__.py

并且您在外部调用某些框架,您有两种方法:

1)最糟糕的方法:将外部文件夹路径手动导入到当前路径:

import os
import sys
parentPath = os.path.abspath("..")
if parentPath not in sys.path:
    sys.path.insert(0, parentPath)

在此示例中,如果之前未导入../,则将其导入当前路径。

2)更好的方法。您使用__init__.pytests/软件包导出到外界:

# tests/__init__.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from my_class_A import ClassA
from my_class_B import ClassB

,以便您可以照常将类ClassA导入外部文件:

# main.py
from tests import ClassA

具有以下结构:

mycompany/
__init__.py
main.py
tests/
__init__.py
my_class_A.py
my_class_B.py

(这只是一个想法,当然您必须根据实际情况调整导入和路径)。