不同项目的python库如何在同一个包中?
假设您有一个大型(python)软件项目,名为Ninja。该项目有几个部分,如服务器和客户机,但也有一个公共基础结构库,其中包含公共类和工具。当然,我会创建这样的包结构:不同项目的python库如何在同一个包中?,python,import,package,Python,Import,Package,假设您有一个大型(python)软件项目,名为Ninja。该项目有几个部分,如服务器和客户机,但也有一个公共基础结构库,其中包含公共类和工具。当然,我会创建这样的包结构:ninja.core、ninja.server和ninja.client,其中服务器和客户端都以某种方式导入ninja.core。出于开发目的(我们将eclipse与Subversion一起使用),在不同的项目中维护核心、服务器和客户端,从而形成如下文件夹结构: eclipse_workspace | >-Ninja_co
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
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;谷歌快速搜索显示,其他人对此表示不满,但我看不到任何简单的解决办法。