2017-03-17 45 views
1

最近,我开始寻找到用Cython,以及Anaconda分布有这个方便的脚本cythonize允许做如何使用cythonize-script包含numpy?

>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

如果我使用-XI得到

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

回答

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

+0

好吧,我想我会做一个自动设置生成器,让我为每个循环的例子每次扭动这样一个简单的安装文件... – Copperfield

+0

如果你只是原型的东西,我经常只是在一个jupyter笔记本并使用'%% cython'魔法。 – JoshAdel

+0

听起来不错,但我不习惯使用它,我更习惯与控制台一起工作 – Copperfield