【问题标题】:Python namespace package clear folder structurePython命名空间包清除文件夹结构
【发布时间】:2019-10-14 12:56:04
【问题描述】:

我想设置一个 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

我认为这看起来像一个带有模块的传统包,但我还没有找到将其设置为 packgae 的方法,而 mainintainign 选项只安装特定模块,因此我认为命名空间包应该提供该选项,但我不能完全让它与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

【问题讨论】:

    标签: python pip python-3.7 setup.py


    【解决方案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
    

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

    老实说,如果路径长度限制问题真的发生了,我会感到惊讶,而且我相信它仍然会发生在你无法控制的事情上(比如 3rd 方包:numpy、pandas、plotlib 可能有很多嵌套的子包也是如此)。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2022-01-05
      • 2012-11-10
      • 2013-10-14
      相关资源
      最近更新 更多