问题标签 [cythonize]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
202 浏览

python - 如果在数组创建期间定义了 NumPy 数组的元素,为什么 Cython 需要更多的 Python 调用?

.pyx如果我在数组创建期间定义数组元素( ),我不明白为什么 Cython 需要更多 Python 调用来编译我的文件#-1-

对于元素pos1pos2PyFloat_FromDouble被调用四次,每个变量调用两次,但是如果我创建一个空数组或零数组并在之后更改元素 ( #-2-),则不使用此函数。

我正在使用 Python 2.7.13、NumPy 1.13.1 和 Cython 0.25.2

0 投票
1 回答
2306 浏览

python - Cython cimport 找不到 .pxd 模块

已解决,请参阅编辑#3

假设一个包的结构如下:

我在哪里definition.pxd

helper.pxd我有:

helper.pyx我什么都没做cimport。我配置setup.py为:

现在我的问题是python setup.py build_ext --inplace我可以成功构建.so,但是当我尝试时,import some_package.helper.helper我得到了ImportError

ImportError: No module named "some_package.helper.helper"

我调查helper.cpp并发现了一些类似的行:

我想这可能与导入路径有关,但我无法发现问题所在。所有__init__.py的都是空的,我absolute_import在每个文件中都导入了。我也更改了include_dirs,但仍然无法正常工作。

编辑#1

根据文档include_dirs添加到*.pxd搜索路径。所以我也尝试将cimport语句更改helper.pxd为:

这一次,cython无法编译:"definition.pxd" not found. 但是,它应该在搜索路径中。

编辑#2

快速锻炼是添加一个空definition.pyx的 in core/,然后将扩展配置为:

然后在setup.py

现在cimport some_package.core.definition正在工作helper.pxd

然而,这并不优雅。

编辑 3

我终于发现我忽略了一些行,例如:

但是,在.pxd文件中,不能有任何可执行代码。在这种情况下,它似乎Cython将其视为一个包,而不是有.pyx文件。

可能有两种方法可以解决:

  1. cdef extern从一个C标题。

  2. 总结内联函数。

0 投票
0 回答
269 浏览

python - Cython:将 INFINITY 或 numpy.inf 分配给类型化变量结果为 0

我希望在一个名为的文件中有cdef一个常量,以便我可以在其他地方使用它。假设我们有:INFINITYconstant.pxdcimportconstant.pxd

但是,这不起作用,例如,在另一个.pyx文件中:

产生:

我也尝试INF直接定义为np.float32('inf')or np.inf。但是,它们最终都为零。

但是,我可以INF = np.float32('inf')在不输入.pyx文件的情况下定义它,constant.pyx并按预期使用它。我不清楚这是否会导致执行问题,如果我们有,说:

与:

0 投票
0 回答
1136 浏览

python - Cython C++ 包装器中的未定义符号

我有一个工作cpp项目,可以很好地使用cmake. 现在我需要为它创建一个 Python 包装器。所以我选择cython弥合C++和之间的差距Python

我没有在文件中编写CMakeLists.txt逻辑pyx,而是尝试cmake自己编译库,然后将 Cython 包装器包装在它周围。以下是setup.py文件:

这是call_core.pyx文件:

现在,如果我getVal()在头文件本身中实现该方法,则此文件可以正常工作。但是,一旦我将实现移到.cpp文件中,Cython 编译器就会显示以下错误:

注意:上面的代码片段非常适合在.h文件中实现的功能。

0 投票
1 回答
522 浏览

python - 使用 distutils 编译 Cython 代码时出现问题

我正在尝试编译 Cython 代码并将其用作 Python 模块。我遵循了 Cython 的基本教程。我已经制作了文件 hellowolfrd.pyx:

我已经制作了 setup.py:

并运行:

但不幸的是出现了错误:

似乎 gcc 对 python3.5 库不满意。我尝试使用以下命令在没有 distutils 的情况下进行编译:

它奏效了。从知道我可以从 Python 解释器导入 helloworld。但我不知道如何使用 distutils 编译 Cython 代码。我尝试使用 extra_compile_args 传递相同的标志,但没有奏效。

UPD:发现 gcc 找不到 python 的 64 位库,所以试图显式显示库目录。所以我改变了 setup.py

仍然是相同的输出

0 投票
1 回答
2711 浏览

python - Cython 编译错误“常量表达式中不允许”

以下

工作正常。但是当我尝试这个时:

我收到以下错误:

添加装饰器是因为找到了这个相关的 stackexchange 帖子并阅读了 Kurt W. Smith 的 Cython 书。据我所知,这应该可以告诉 Cython 不要担心可能由动态索引变量导致的越界错误,但由于某种原因它没有。我还尝试在编译器选项和全局范围内更改边界检查,但无济于事。

如果不是因为 Cython 文档声称是最新的,我会认为 boundscheck 已经贬值了。

0 投票
2 回答
5469 浏览

swig - PyBind - 重载函数

首先,我感谢你们所有人试图解决我的这个疑问。我正在努力将一个最小的 C++ 项目转换为在 Python 中使用。这种努力背后的真正原因是为了速度。

我遇到了 PyBind,对它的功能以及它们提供的大量文档感到非常惊讶。现在有一些事情停止了工作,因为我不知道该怎么做。考虑文件“MySource.hpp”中的以下代码,您能告诉我如何进行绑定吗?

我能够将 Point3D 的绑定定义为一个类及其某些成员函数。但我不知道如何为重载方法“ VectorCross ”进行绑定。它有两种方法,一种接受 Point3D 的实例,另一种接受指向浮点数组的指针。

到目前为止我写的绑定如下所示

有人可以指导我如何做到这一点吗?

0 投票
1 回答
582 浏览

python - 如何在编译之前调试 cython 代码?

我最近遇到了cython 的 sentdex 教程。在尝试他的教程代码时,我注意到我们将如何在编译之前调试我们的 cython 代码。

example_original.py我们可以通过在解释器中运行来调试原始代码。

但是 cythonized 代码不起作用。这是我尝试过的两种方法

1)py文件

错误

2).pyx 文件

错误

在编译之前调试 cython 代码的正确方法是什么?

0 投票
1 回答
3779 浏览

python - Cython 在单独的目录中编译模块

我是cython的新手。

我有以下目录结构。

你好世界.py

打印名称.py:

设置.py:

我遇到的问题是,当我python setup.py build_ext --inplacecython_program目录中使用编译程序时。它确实成功编译了程序并printname.c在 lib 文件夹中生成了一个文件。

但是当我将 printname.py 和 helloworld.py 移动到一个单独的文件夹以确保我的 cython 编译代码正在运行时。它给了我以下错误 ImportError: No module named lib.printname

为什么不使用主helloworld.py文件编译模块(lib.printname)?

注意:如果我将 helloworld.py 和 printname.py 保存在同一个文件夹中,这会很好。

提前致谢。

0 投票
1 回答
226 浏览

python - cython 打印大于 65535 的错误值

我认识到将数字传递给 cython 中的函数的奇怪行为,其值大于 65535。但这只有在将这些数字传递给函数时才会出现。如果我将它们定义为

一切正常。为了澄清我的问题,我通过了我用来调查这个问题的两个虚拟函数

以及被调用以获取“.pyd”文件的“setup.py”。

之后我用命令创建了“.pyd”文件

使用命令提示符。使用的 c 编译器是 gcc。

如果我然后调用“bigNum1”或“bigNum2”,将产生以下输出。

如您所见,所有大于 65535 的数字都显示错误,使用 bigNum2。跟着你看到这个函数的调用。

我希望你能理解我的问题。我的猜测是,我在 bigNum2 中做了错误的声明,导致类型错误,或者我必须在将数字传递给此方法之前进行某种类型转换。

编辑:

这是cmd提示符过程中显示的文字

编辑2:

我使用 cython 0.25.2 附带的 Winpython 包“WinPython 3.6.1.0Qt5-64bit”。但我用 pip 升级它以获得最新版本。

首先,我尝试使用此处的教程获取我的 .pyd。

http://docs.cython.org/en/latest/src/quickstart/build.html

但在构建过程中,我收到一条错误消息“错误:无法找到 vcvarsall.bat”。这就是为什么我决定将 Mingw 与 gcc 一起使用。但这也产生了一个错误,在这篇文章中有描述。

ValueError:未知的 MS 编译器版本 1900

我用 Indrajit Kanjilal 的回答解决了这个问题。我们现在就在那里。我可以创建一个 .pyd 文件,可以调用该函数,但如果该值大于 65535,则会发生错误。希望有帮助。