gpt4 book ai didi

Python C-ext 命名空间与常规 python 子模块混合?

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:29 27 4
gpt4 key购买 nike

这个问题有一些相似之处:

Nested Python C Extensions/Modules?

只有轻微的扭曲。在这里,我不是要混合使用两个 C-ext,而是混合使用一个 C-ext 和一个常规 python 子模块。

有没有办法让 C 扩展在符号“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 子模块放回去并尝试导入不同的部分时,一个 namespace 似乎掩盖了另一个(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) 之后,buildqueryremove 都消失了并且 银河除非我执行 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 文件实际上被复制到顶级目录,但触摸它与否并不影响上述导入行为。

有什么想法吗?提前致谢!

最佳答案

请注意,您首先导入的是 so 文件,而不是 facs 包。您是否在 facs 包源目录上运行 python 控制台?

尝试走出包目录,一切都会有意义。

另外,next import 并不是说​​你的 facs 目录后面的所有模块都将被导入:

>> import facs
>> dir (facs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

您必须在每个 __init__.py 文件中设置您的导入,例如,如果您想在 import 时从 .so 文件中导出一些符号facs,您的 __init__.py 文件中应该包含以下内容:

>> from _facs import function_name, function_name .....

然后,当您import facs 时,它会为您导入这些函数。

对您的子包实用程序采用相同的模式。

我还建议将您的 facs.so 文件重命名为 _facs.so 文件以避免包名称和模块名称之间的名称冲突。

关于Python C-ext 命名空间与常规 python 子模块混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15161277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com