【发布时间】:2016-03-22 17:23:54
【问题描述】:
我在pycharm中使用anaconda,你可能知道,在anaconda中已经默认安装了cython。我的项目包含一个小 cython 代码,我想在 pycharm 中运行它。我该怎么做?
【问题讨论】:
我在pycharm中使用anaconda,你可能知道,在anaconda中已经默认安装了cython。我的项目包含一个小 cython 代码,我想在 pycharm 中运行它。我该怎么做?
【问题讨论】:
最简单的方法是使用 pyximport:
在你的 main.py 中添加:
import pyximport
pyximport.install(setup_args={'include_dirs': np.get_include()})
import cython_helper
并将您的 cython 代码放在 cython_helper.pyx 文件中。
如果你在 windows 上运行它,在运行你的 python 代码之前你应该设置 ENV 变量(VS 2013):
SET VS90COMNTOOLS=%VS120COMNTOOLS%
【讨论】:
这个问题可能意味着两种不同的东西:
您有一个 .pyx 源文件,但您将其视为任何旧的 Python 脚本,您只想调用脚本的操作。
您的 .pyx 文件是一个扩展模块,构建完成后,您想从中导入。
您可以像在另一个答案中一样使用pyximport,但另一个方便的工具是最近的runcython project。安装runcython 后,对于上面的案例#1,您可以简单地这样做:
runcython my_file.pyx
在您的命令提示符下,my_file.pyx 将被编译,然后以与任何通用 Python 脚本相同的方式执行。任何顶级语句都将被执行,但为方便起见添加了一个额外的约定:如果您的脚本中恰好有一个名为 main 的函数,那么 runcython 将自动调用它,将其视为 if __name__ == '__main__' 部分一个通用的 Python 脚本。因此,如果你想用 Cython 做“脚本”,你应该做所有的顶级定义,然后把所有的“工作”放到一个名为 main 的顶级函数中,这是一个很好的做法。 .
请注意,通常的 if __name__ == '__main__' 技巧通常不适用于扩展模块,因为在底层它依赖于 python -m 模块执行过程,该过程使用标准库 runpy 和 runpy 需要那里成为执行模块的代码对象——扩展模块通常没有的东西。您将收到“无代码对象”错误(例如,在从 Cython 构建和安装 .so 之后,例如 my_file.so,只需使用 python -m my_file 尝试)。
对于案例 #2,runcython 项目还提供了 makecython,这是对更普遍依赖的基于 distutils 的多文件方法的巨大简化。因此,一旦您使用了runcython 来玩弄代码,就可以将makecython 用于合法的构建和部署部分。
这仍然是一个新库,所以如果您谈论的是现实世界、生产依赖或其他东西,我不推荐它。对于这种情况,pyximport 仍然会更好。
但是,如果您只想像调用通用模块一样调用 .pyx 扩展模块,那么对于快速而繁琐的工作,runcython 是一个方便的选择。
【讨论】: