Python名称空间包清除文件夹结构

时间:2019-10-14 12:56:04

标签: python pip python-3.7 setup.py

我想设置一个python命名空间软件包,其中包含几个需要独立安装的连接软件包,除非明确指定了依赖关系。但是,现有的解决方案对我来说似乎更不那么混乱。

例如,其中一个软件包包含大多数问题逻辑,而其他软件包则包含辅助功能,例如绘图和数据导出。逻辑包需要保持精简状态,并且不能导入超过numpy的位置,因为其他包可以利用更复杂的包,例如pandasmatplolib我想建立一个类似于名称空间包的结果命名空间的包结构,但没有不必要的文件夹嵌套之类的东西,例如 this:

namespace
├── logic
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires numpy    
├── datastructure
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires namespace.logic and pandas
├── plotting
│    ├── __init__.py
|    ├──  functions.py
│    └──  setup.py # requires namespace.logic, namespace.datastructure and matplotlib
└── setup.py #should install every package in namespace

我认为这看起来像是带有模块的常规软件包,但是在mainintainign仅安装特定模块的选项时,我还没有找到一种将其设置为packgae的方法,因此我认为命名空间软件包应该提供该选项,但是我无法完全与pip

一起使用

此刻,我将需要具有两个以上的目录级别:

namespace
├── NamespaceLogic          #don't want this
│   ├── namespace           #don't want this
│   │   └── logic
│   │       └── __init__.py
│   └── setup.py
├── NamespaceDatastructure  #don't want this
│   ├── namespace           #don't want this
│   │   └── datastructure
│   │       └── __init__.py
│   └── setup.py
├── NamespacePlotting       #don't want this
│   ├── namespace           #don't want this
│   │   └── plotting
│   │       └── __init__.py
│   └── setup.py
└── setup.py

我的问题类似于以下问题:Python pip install sub-package from own package,但我想避免拥有太多子文件夹,因为这会带来最大限度地限制系统路径长度的风险(+会使其他所有人感到困惑)。我需要如何配置不同的setup.py文件才能运行

pip install namespace #installs namespace.logic, namespace.datastructure, namespace.plotting
pip install namespce.logic #installs only namspace.logic and works in an environment with numpy which does not have pandas or matplotlib

1 个答案:

答案 0 :(得分:1)

您可以利用setuptools的package_dir选项来摆脱命名空间包的空文件夹:

NmspcPing
├── ping
│   └── __init__.py
└── setup.py
import setuptools
setuptools.setup(
    name='NmspcPing',
    version='0.0.0.dev0',
    packages=['nmspc.ping'],
    package_dir={'nmspc.ping': 'ping'},
)

以下类似的方法也是可行的,但是根据项目的构建或安装方式,setup.py文件也可能会作为软件包的一部分包含在内(可能是不需要的):

.
├── ping
│   ├── __init__.py
│   └── setup.py
├── pong
│   ├── __init__.py
│   └── setup.py
└── setup.py

如果路径长度限制是一个问题,那么使用较短的程序包名称可能是更好的选择。因为在很多情况下,即使您在源代码存储库中跳过软件包,软件包仍会与所有目录级别一起安装(除非它们保持压缩状态)。

老实说,如果确实发生了路径长度限制问题,我会感到惊讶,而且我认为无论如何您仍然无法控制它们(例如第三方软件包:numpy,pandas,plotlib)嵌套子包)。