2015-08-21 30 views
5

假设您有一个名为Ninja的大型(python)软件项目。该项目有几个部分,如服务器客户端,而且还包含一个通用的基础结构库,其中包含常用的类和工具。当然,我会创建一个像这样的包裹结构:ninja.core,ninja.serverninja.client,其中服务器客户端以某种方式导入ninja.core。为发展宗旨(我们使用Eclipse与Subversion)的核心服务器客户保持在不同的项目,从而导致在一个文件夹结构是这样的:不同项目的python库如何处于同一个包中?

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
. 
. 
. 

有一个Java的背景我假设这将是可能的,但事实证明(读取:导入错误),这是行不通的。正如this answer指出的那样,它通常是不可能有两个ninja.coreninja.client除非它们是相同的包ninja,其中它们不是子包。这样就产生了:

解决方法A:

  • 放在一个单一的Eclipse/SVN项目整个代码和只有一个 包ninja与根据子包。

在生产环境中,我们希望能够安装核心服务器但不客户核心客户但不服务器。我可能会误解,但据我了解python包,这是不可能的方法A.保持项目分开但兼容,使用包名称为ninja_core,ninja_clientninja_server,它似乎是有用的事实上解决了进口问题,并使开发设置中的一切顺利运行。为了满足能够安装服务器客户独立的要求,我想出的主意:

方法B:

  • 创建一个名为忍者新的项目,包含软件包ninja
  • 让的ninja导入其他库(如果安装的话),看起来是在之内。

我还没有得到这个工作到目前为止,我认为它可能不可能。我在想这样的事情:

# __init__.py of ninja 
import ninja_core as core 
# or this: 
from ninja_core import core 
# or this: 
import ninja_core.core 

我试过这些,又得到了导入错误。在google搜索结合python软件包的方法并没有找到与我的问题相关的任何东西之后,我来到了这里。

我在想,也许整件事都是设计错误。应该客户端服务器即使它们可以独立安装在同一个包中?想要独立安装客户端和服务器是不是一个好主意?为什么我可以在java中使用扩展包,但是不能在python中使用?这背后的想法是什么?

TL;博士

我开发的忍者图书馆,用户应该能够做到import ninja.clientimport ninja.server。需要分别为客户端服务器安装库。如何实现这一目标?

回答

3

如果您将顶层命名空间ninja清空,则此操作已在Python 3.3及更高版本中本机支持,请参阅PEP 420;所有你需要做的就是创建ninja目录和离开了__init__.py文件在该目录中

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
|  | 
|  >-__init__.py 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
|  | 
|  >-__init__.py 

ninja目录保持为空除了孩子coreclient目录。那些目录__init__.py文件。

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

其基本原理是确保您的项目是包含setup.py文件的包,并且安装在development mode或作为最终产品安装。你ninja目录然后有一个__init__.py文件,但这些必须只包含以下行:

__import__('pkg_resources').declare_namespace(__name__) 

setup.py文件为每个项目必须声明命名空间:

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

它的工作原理,但由于'ninja'文件夹中不包含'__init __。py',eclipse不能识别任何子文件夹是软件包。有没有一个选项或简单的解决方法呢? – nfs

+0

对不起,不知道;我自己不使用Eclipse或PyDev;一个快速的谷歌显示其他人抱怨,但我没有看到任何简单的修复你。 –

相关问题