首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将numpy和cythonize-脚本包括在一起?

如何将numpy和cythonize-脚本包括在一起?
EN

Stack Overflow用户
提问于 2017-03-17 04:19:46
回答 2查看 1.1K关注 0票数 4

最近,我开始研究Cython,Anaconda发行版有一个方便的脚本cythonize,允许这样做。

代码语言:javascript
复制
 >cythonize -i foo.pyx

将文件编译到位。

我的问题是如何使用这个脚本来包含numpy,这样我的cimport numpy才能正常工作?

我试过了

代码语言:javascript
复制
>cythonize -X include_path=C:\Anaconda3\lib\site-packages\numpy\core\include  -i foo.pyx
>cythonize -s include_path=C:\Anaconda3\lib\site-packages\numpy\core\include  -i foo.pyx

还有include_dir=...include_dirs=...,-X和-s

如果我使用-X,我会得到

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Anaconda3\Scripts\cythonize-script.py", line 5, in <module>
    sys.exit(Cython.Build.Cythonize.main())
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Cythonize.py", line 185, in main
    options, paths = parse_args(args)
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Cythonize.py", line 172, in parse_args
    options, args = parser.parse_args(args)
  File "C:\Anaconda3\lib\optparse.py", line 1387, in parse_args
    stop = self._process_args(largs, rargs, values)
  File "C:\Anaconda3\lib\optparse.py", line 1431, in _process_args
    self._process_short_opts(rargs, values)
  File "C:\Anaconda3\lib\optparse.py", line 1536, in _process_short_opts
    option.process(opt, value, values, self)
  File "C:\Anaconda3\lib\optparse.py", line 785, in process
    self.action, self.dest, opt, value, values, parser)
  File "C:\Anaconda3\lib\optparse.py", line 805, in take_action
    self.callback(self, opt, value, parser, *args, **kwargs)
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Cythonize.py", line 38, in parse_directives
    value, relaxed_bool=True, current_settings=old_directives)
  File "C:\Anaconda3\lib\site-packages\Cython\Compiler\Options.py", line 424, in parse_directive_list
    raise ValueError('Unknown option: "%s"' % name)
ValueError: Unknown option: "include_path"

用-s我得到

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Anaconda3\Scripts\cythonize-script.py", line 5, in <module>
    sys.exit(Cython.Build.Cythonize.main())
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Cythonize.py", line 196, in main
    cython_compile(path, options)
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Cythonize.py", line 90, in cython_compile
    **options.options)
  File "C:\Anaconda3\lib\site-packages\Cython\Build\Dependencies.py", line 809, in cythonize
    ctx = c_options.create_context()
  File "C:\Anaconda3\lib\site-packages\Cython\Compiler\Main.py", line 581, in create_context
    self.cplus, self.language_level, options=self)
  File "C:\Anaconda3\lib\site-packages\Cython\Compiler\Main.py", line 90, in __init__
    self.include_directories = include_directories + [standard_include_path]
TypeError: unsupported operand type(s) for +: 'bool' and 'list'

是的,我可以制作一个setup.py,但是我发现这很烦人,它会把构建文件夹留在那里,而cythonize则不会这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-17 14:05:16

看起来不可能通过命令行版本的cythonize传递包含dirs。

问题是,在cython源代码中,它希望选项是布尔值:

https://github.com/cython/cython/blob/master/Cython/Build/Cythonize.py#L48

因此,当您包含一个路径时,它将被转换为True

代码语言:javascript
复制
cythonize -i -s include_path=path_to_numpy_include test.pyx

这些选项被解析为:

代码语言:javascript
复制
{'directives': {}, 'options': {'include_path': True}, 'python3_mode': None, 'annotate': None, 'excludes': [], 'build': True, 'build_inplace': True, 'parallel': 12, 'force': None, 'quiet': None, 'lenient': None, 'keep_going': None}

这将导致您报告的类型错误:

代码语言:javascript
复制
TypeError: unsupported operand type(s) for +: 'bool' and 'list'

我认为你最好的选择就是使用一个合适的setup.py

票数 5
EN

Stack Overflow用户

发布于 2022-07-20 13:33:45

您可以通过设置由C编译器解释的环境变量(它将运行作为子进程来运行)来实现这一点。例如,使用GCC嘎吱声

代码语言:javascript
复制
C_INCLUDE_PATH=$(python -c 'import numpy; print(numpy.get_include())') cythonize -i foo.pyx
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42849160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档