2013-06-19 35 views
1

我最近构建了一个Python包,并通过Debian打包程序进行安装。它安装在我的系统上,所以我可以在其他项目中使用它。在我的新项目中,我有一个包名称相同的文件夹,即欧泊。我扫描的网页,包括这个网站,一切都朝着采用指出:Python导入冲突

from __future__ import absolute_import 

不幸的是,它解决不了问题,我怀疑我缺少一个细节。

我使用Python 2.7.3,这里是我的项目文件夹结构:

安装封装结构:

- opal 
    __init__.py 
    core.py 

新建项目结构:

- opal 
    - __init__.py 
    - net.py 

在新的项目中,我不能做:

from opal.core import OpalClient 

我总是得到一个错误,core没有在opal下找到!

如果__future__是解决方案,有人可以给我一个例子。我尝试了几种方法,总是遇到错误。我发现这对于这样一个整洁的语言尴尬的问题;)

干杯

回答

1

Python做没有额外的帮助合并命名空间。在找到其他顶级opal软件包之前发现的一个位置中有一个opal顶级软件包。找到的第一个包含opal.net作为包含模块,但不包含opal.core模块。

您需要使用setuptools namespace setup来启用此行为;请使用setuptools兼容setup.py安装包,并让它为您注册和管理名称空间。

如果您使用Python 3.3或更新版本,您可以使用新的PEP 420 namespace support,在那里你会离开的顶级目录(或目录)创建,然后可以合并命名空间。另请参阅Python 3导入系统文档中的Namespace packages

+0

debian软件包的解决方案是什么?我们的用户和开发人员都有这两种选择,可通过Linux平台上的apt-get或Python方式(setuptools)安装软件包。 – user2449584

+0

我相信[Debian Python tools](http://wiki.debian.org/Python/FAQ#Python_eggs)可以直接处理鸡蛋。正确的元数据应该存在,以便setuptools扩展可以找到不同的'opal'包,并确保Python将它们视为一个顶级命名空间。 –

+0

在Python 3.3及更高版本中,您可以在不使用setuptools的情况下创建名称空间。 https://www.python.org/dev/peps/pep-0420但是你不能使用Python 3.2或者更重要的Python 2. –