【发布时间】:2013-03-01 15:31:26
【问题描述】:
这个问题与:
Nested Python C Extensions/Modules?
只有轻微的扭曲。在这里,我不是要混合两个 C-ext,而是一个 C-ext 和一个常规 python 子模块。
C-extension 有没有办法在符号“module.so”和子模块中的符号之间共享模块命名空间?
我的模块结构如下所示:
facs/
facs/
__init__.py
setup.py
facs.so
[*.c files]
utils/
__init__.py
galaxy.py
如果我从层次结构中删除“utils”,我可以导入 facs 并查看 facs.so 方法:
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove']
但是当我放回 utils 子模块并尝试导入不同的部分时,一个命名空间似乎掩盖了另一个(utils 掩盖了facs.so 导出的符号):
>>> import facs
>>> dir(facs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import facs.utils
>>> facs.utils.galaxy.rsync_genomes("phix")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'galaxy'
>>> from facs.utils import galaxy
>>> galaxy.rsync_genomes("phix")
'Hello world'
如你所见,dir(facs)、build、query 和 remove 消失了,galaxy
除非我改为使用from facs.utils import galaxy,否则无法正确导入
重新使用初始导入语句并直接通过facs.utils.galaxy.rsync_genomes() 访问。
总而言之,我打算使用这个模块来做:
>>> import facs
>>> dir(facs)
['__doc__', '__file__', '__name__', '__package__', 'build', 'query', 'remove'
, 'utils'] <--- (Directly accessible from "facs")
>>> facs.utils.galaxy.rsync_genomes("phix")
'Hello world'
(目前正在开发的)代码在:
https://github.com/brainstorm/facs/tree/develop
如果有人想自己尝试一下。我正在使用 virtualenvs 和我的 $PYTHONPATH 似乎是正确的:
/home/roman/.venvburrito/lib/python:
/home/roman/.virtualenvs/py27/lib/python2.7/site-packages
而且安装好像也成功了:
cd ~/.virtualenvs/py27/lib/python2.7/site-packages/facs-2.0dev-py2.7.egg/
(py27)$ ls
EGG-INFO facs.py facs.pyc facs.so utils/
似乎没有__init__.py文件实际上被复制到顶级目录,但在那里触摸它不会影响上述导入行为。
有什么想法吗?提前致谢!
【问题讨论】:
-
您是否尝试将
facs.so重命名为其他名称?尝试为包和.so使用不同的名称 -
.so文件是在编译/安装 python 模块时生成的,我自己不会生成它...抱歉,如果不清楚:-S
标签: python namespaces python-import python-c-extension