当前位置: 首页 > 面试题库 >

带有__init __。pyx的Cython软件包:可能吗?

潘青青
2023-03-14
问题内容

是否可以使用__init__.pyx(编译为__init__.so)创建Python2.7软件包?如果可以,怎么办?我没有运气让它工作。

这是我尝试过的:

  • setup.py

    #!/usr/bin/env python
    

    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext

    foo = Extension(name=’foo.init’, sources=[‘foo/init.pyx’])
    bar = Extension(name=’foo.bar’, sources=[‘foo/bar.pyx’])

    setup(name=’foo’,
    packages = [‘foo’],
    cmdclass={‘build_ext’:build_ext},
    ext_modules = [foo, bar])

  • foo/__init__.pyx

    import foo.bar
    

    cpdef hello_world():
    print “hello world”
    foo.bar.blah()

  • foo/bar.pyx

    cpdef blah():
    print "blah"
    

上面有以下行为:

$ python -c 'import foo; foo.hello_world()'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named foo

我看到了此Hg
commit修复的Python问题#15576。在Python
Hg存储库的Git镜像中查看等效的Git提交,我发现可以从Python
v2.7.5标记(以及所有后续v2.7.x版本)访问该提交。有回归吗?


问题答案:

根据这个确实很老的邮件列表帖子,如果您还有一个__init__.py文件,它也可以工作(该__init__.py文件未使用,但对于将目录视为模块,从而__init__.so加载该文件似乎是必需的)。

如果我添加__init__.py

# an exception just to confirm that the .so file is loaded instead of the .py file
raise ImportError("__init__.py loaded when __init__.so should have been loaded")

那么您的示例可在Linux Python 2.7.3上运行:

$ python -c 'import foo; foo.hello_world()'
hello world
blah

这有一个拐弯处的情况,因此不建议使用。请注意,在Windows上,这似乎对我不起作用

ImportError: DLL load failed: %1 is not a valid Win32 application.

附录 (需要一些额外说明):

似乎没有明确记录此行为。在关于Python
1.5时代的软件包的原始描述中,他们说:

如果没有__init__.py,则无法将目录识别为包

提示:搜索顺序由函数返回的后缀列表确定imp.get_suffixes()。通常,后缀按以下顺序搜索:“。so”,“
module.so”,“。py”,“。pyc”。目录没有显式出现在此列表中,而是位于其中的所有条目之前。

观察到的行为当然与此一致-__init__.py需要将目录视为一个包,但是优先加载.so文件而不是.py文件-但这并不是明确的。

从Cython的角度来看,此行为似乎已用于编译标准库(在这种情况下__init__.py始终存在),或者在给出的测试用例中使用https://github.com/cython/cython/blob/master/
tests / build /
package_compilation.srctree(还有其他一些示例)。在这些文件中,“
srctree”文件看起来将扩展为包含__init__.py(然后是其他文件)然后编译的各种文件夹。仅有的__init__.so经历可能从未被测试过。



 类似资料:
  • 问题内容: 我正在使用Python 3.5.1。我在这里阅读了文档和包部分:https : //docs.python.org/3/tutorial/modules.html#packages 现在,我具有以下结构: : 现在,在: 同样,现在在家里,超级文件夹: 实际上,我可以做各种事情: 为什么这样做?我虽然有被需要的文件(空的都可以)两种,并为要导入的时候Python的路径指向文件夹? 这似

  • 本文向大家介绍pyx文件 生成pyd 文件用于 cython调用的实现,包括了pyx文件 生成pyd 文件用于 cython调用的实现的使用技巧和注意事项,需要的朋友参考一下 pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,“语法错误”。 上面的pyx文件还仅仅是源代码文件,要想

  • 问题内容: 我在Windows机器上安装Python软件包(特别是JPype1 0.5.7)时遇到问题,并且想用Christoph Gohlke的Window二进制文件安装它。(根据我的经验,这减轻了许多其他软件包安装的麻烦。) 但是,尽管Christoph过去曾经提供.exe文件,但最近看来他是在上载.whl文件。 http://www.lfd.uci.edu/~gohlke/pythonlib

  • 问题内容: 我想发布一个包含我的源代码和分发文件的npm软件包。我的Github存储库包含包含JavaScript源文件的文件夹。生成过程将生成包含分发文件的文件夹。当然,该文件夹不会签入Github存储库。 我该如何发布npm软件包,以使某人这样做时他们和文件夹一样好?当前,当我从git存储库运行时,它只会导致发布文件夹。 我的package.json看起来像这样: 问题答案: 看看packag

  • PyX

    PyX 是一个用来创建 PostScript 和 PDF 文件的 Python 包,包含了通过 TeX/LaTeX 接口的 PostScript 绘图模型的抽象。复杂任务包括 2D 和 3D 图都是具备发行级别的质量。

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中