【问题标题】:how to include numpy with cythonize-script?如何在 cythonize-script 中包含 numpy?
【发布时间】:2017-08-08 12:25:24
【问题描述】:

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

 >cythonize -i foo.pyx

就地编译文件。

我的问题是如何使用该脚本包含 numpy 以便我的 cimport numpy 正常工作??

我试过了

>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 我会得到 ​​p>

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 我得到

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 不这样做。

【问题讨论】:

    标签: python numpy windows-10 anaconda cython


    【解决方案1】:

    似乎无法通过cythonize 的命令行版本传入包含目录。

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

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

    因此,当您包含路径时,它会转换为 True

    cythonize -i -s include_path=path_to_numpy_include test.pyx
    

    并且选项被解析为:

    {'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}
    

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

    TypeError: unsupported operand type(s) for +: 'bool' and 'list'
    

    我认为你最好的选择是使用正确的setup.py

    【讨论】:

    • 好吧,我想我会制作一个自动设置生成器,让我免于每次为每个 cython 示例扭动这样一个简单的设置文件......
    • 如果你只是在做原型,我通常只是在 jupyter notebook 中工作并使用 %%cython 魔法。
    • 听起来不错,但我不习惯用它,我更习惯用控制台
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多