本地软件包将屏蔽环境中其他任何具有相同名称的软件包。
复制步骤:
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
答案 0 :(得分:0)
您可以对本地软件包使用.
表示法,如下所示:
from .pandas import DataFrame
通过避免混淆的方法,最好避免使用与numpy
,pandas
等知名软件包相同的名称。否则,您可以这样做
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__.py
将tests/
软件包导出到外界:
# 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
(这只是一个想法,当然您必须根据实际情况调整导入和路径)。