Python 命名空间包清晰的文件夹结构
Python namespace package clear folder structure
我想设置一个 python 命名空间包,其中包含几个需要独立安装的连接包,除非明确指定依赖关系。然而,现有的解决方案对我来说似乎更加混乱。
例如,其中一个包包含大部分问题逻辑,其他包包含绘图和数据导出等辅助功能。逻辑包需要保持苗条,不能导入超过 numpy
,因为其他包可以使用更复杂的包,如 pandas
和 matplolib
。 我想设置一个包结构,它看起来像命名空间包的结果命名空间,但没有不必要的文件夹嵌套,例如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,同时维护仅安装特定模块的选项,因此我假设命名空间包应该提供该选项但我不能完全让它与 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
您可以使用 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
如果路径长度限制是一个问题,那么使用较短的包名称可能是更好的选择。因为在许多情况下,软件包无论如何都会安装在所有目录级别(除非它们保持压缩状态),即使您在源代码存储库中跳过它们也是如此。
老实说,如果路径长度限制问题真的发生了,我会感到惊讶,而且我相信无论如何它仍然会发生在你无法控制的事情上(比如第 3 方包:numpy,pandas , plotlib 可能也有很多嵌套的子包)。
我想设置一个 python 命名空间包,其中包含几个需要独立安装的连接包,除非明确指定依赖关系。然而,现有的解决方案对我来说似乎更加混乱。
例如,其中一个包包含大部分问题逻辑,其他包包含绘图和数据导出等辅助功能。逻辑包需要保持苗条,不能导入超过 numpy
,因为其他包可以使用更复杂的包,如 pandas
和 matplolib
。 我想设置一个包结构,它看起来像命名空间包的结果命名空间,但没有不必要的文件夹嵌套,例如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,同时维护仅安装特定模块的选项,因此我假设命名空间包应该提供该选项但我不能完全让它与 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
您可以使用 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
如果路径长度限制是一个问题,那么使用较短的包名称可能是更好的选择。因为在许多情况下,软件包无论如何都会安装在所有目录级别(除非它们保持压缩状态),即使您在源代码存储库中跳过它们也是如此。
老实说,如果路径长度限制问题真的发生了,我会感到惊讶,而且我相信无论如何它仍然会发生在你无法控制的事情上(比如第 3 方包:numpy,pandas , plotlib 可能也有很多嵌套的子包)。