不同项目的python库如何在同一个包中?

不同项目的python库如何在同一个包中?,python,import,package,Python,Import,Package,假设您有一个大型(python)软件项目,名为Ninja。该项目有几个部分,如服务器和客户机,但也有一个公共基础结构库,其中包含公共类和工具。当然,我会创建这样的包结构:ninja.core、ninja.server和ninja.client,其中服务器和客户端都以某种方式导入ninja.core。出于开发目的(我们将eclipse与Subversion一起使用),在不同的项目中维护核心、服务器和客户端,从而形成如下文件夹结构: eclipse_workspace | >-Ninja_co

假设您有一个大型(python)软件项目,名为Ninja。该项目有几个部分,如服务器和客户机,但也有一个公共基础结构库,其中包含公共类和工具。当然,我会创建这样的包结构:
ninja.core
ninja.server
ninja.client
,其中服务器和客户端都以某种方式导入
ninja.core
。出于开发目的(我们将eclipse与Subversion一起使用),在不同的项目中维护核心、服务器和客户端,从而形成如下文件夹结构:

eclipse_workspace
|
>-Ninja_core
| |
| >-ninja
|   |
|   >-core
|
>-Ninja_client
| |
| >-ninja
|   |
|   >-client
.
.
.
有了java背景,我认为这是可能的,但事实证明(读:导入错误)这不起作用。正如中所指出的,通常不可能同时拥有
ninja.core
ninja.client
,除非它们是同一个包
ninja
的子包,而它们不是。这导致:

方法A:

  • 将整个代码放在一个eclipse/svn项目中,并且只有一个 包装
    ninja
    和相应的子包装
在生产环境中,我们希望能够安装核心和服务器,但不能安装客户端,或者安装核心和客户端,但不能安装服务器。我可能弄错了,但就我所理解的python包而言,这在方法A中是不可能的。保持项目独立但兼容,使用名为
ninja_core
ninja_client
ninja_server
的包似乎很有用,这实际上解决了导入问题,并使开发设置中的一切都顺利运行。为了满足能够独立安装服务器和客户端的要求,我提出了以下想法:

方法B:

  • 创建一个名为ninja的新项目,其中包含包
    ninja
  • 忍者
    \uuuuu init\uuuuuuuuuuupy
    导入其他库(如果已安装),使它们看起来像是在
    忍者
到目前为止,我还没有做到这一点,我认为这甚至是不可能的。我在想这样的事情:

eclipse_workspace
|
>-Ninja_core
| |
| >-ninja
|   |
|   >-core
|
>-Ninja_client
| |
| >-ninja
|   |
|   >-client
.
.
.
忍者之初 导入忍者核心作为核心 #或者这个: 从忍者核心导入核心 #或者这个: 导入忍者核心 我尝试了这些,但再次出现导入错误。在谷歌搜索了组合python包的方法,但没有找到任何与我的问题相关的东西之后,我来到了这里

我在想也许整件事都是设计上的失误。如果客户机和服务器可以独立安装,它们是否应该在同一个包中?希望能够独立安装客户机和服务器是个坏主意吗?为什么我可以用java扩展包,而不用python?这背后的想法是什么

tl;dr


我正在开发Ninja库,用户应该能够在其中执行
导入Ninja.client
导入Ninja.server
。需要能够分别为客户端和服务器安装库。如何实现这一点?

如果您将顶级名称空间
ninja
保留为空,则Python 3.3及更高版本已经支持这一点,请参阅;您所要做的就是创建
ninja
目录,并在该目录中省去
\uuu init\uuuu.py
文件:

除了子
core
client
目录外,
ninja
目录仍然为空。这些目录确实有
\uuuu init\uuuu.py
文件

在早期的Python版本中,可以使用添加对名称空间的支持。Zope和Plone项目多年来一直在使用
setuptools
发布名称空间包

基本原则是确保项目是带有
setup.py
文件的软件包,并且安装在最终产品中或作为最终产品安装。然后,您的
ninja
目录确实有一个
\uuuu init\uuuuu.py
文件,但这些目录必须仅包含以下行:

__import__('pkg_resources').declare_namespace(__name__)
每个项目的
setup.py
文件必须声明名称空间:

setup(
    # ...
    namespace_packages = ['ninja']
)

它可以工作,但是由于
ninja
文件夹不包含
\uuuu init\uuuuuy.py
eclipse无法识别任何子文件夹是包。有没有一个选择或简单的解决方法?对不起,不知道;我自己不使用Eclipse或PyDev;谷歌快速搜索显示,其他人对此表示不满,但我看不到任何简单的解决办法。