scipy.weave.inline 的语法错误

SyntaxError with scipy.weave.inline

我最近升级到最新版本的brian2,在运行神经模拟时开始看到以下警告:

WARNING  brian2.codegen.runtime.weave_rt.weave_rt.failed_compile_test: Cannot use weave, a test compilation failed: invalid syntax (<string>, line 1) (SyntaxError)

经过一些挖掘,我发现此警告是由于 brian2 的模块之一中的这些行引发的错误:

compiler, extra_compile_args = get_compiler_and_args()
weave.inline('int x=0;', [],
             compiler=compiler,
             headers=['<algorithm>', '<limits>'],
             extra_compile_args=extra_compile_args,
             verbose=0)

运行这段代码,我得到如下:

In [11]: from scipy import weave

In [12]: compiler
Out[12]: 'gcc'

In [13]: extra_compile_args 
Out[13]: ['-w', '-O3']

In [14]: weave.inline('int x=0;', [], compiler=compiler, headers=['<algorithm>', '<limits>'], extra_compile_args=extra_compile_args, verbose=0)
  File "<string>", line 1
    '\t\t\t\t// SUPPORT CODE\n\t//static py::object _namespace_numpy_rand;\n\t//#define BUFFER_SIZE 1024\n\t//// A rand() function that returns a single random number. Internally\n\t//// it asks numpy\'s rand function for BUFFER_SIZE\n\t//// random numbers at a time and then returns one number from this\n\t//// buffer.\n\t//// It needs a reference to the numpy_rand object (the original numpy\n\t//// function), because this is otherwise only available in\n\t//// compiled_function (where is is automatically handled by weave).\n\t////\n\t//double _rand(const int _vectorisation_idx) {\n\t//    // the _vectorisation_idx argument is unused for now, it could in\n\t//    // principle be used to get reproducible random numbers when using\n\t//    // OpenMP etc.\n\t//    static PyArrayObject *rand_buffer = NULL;\n\t//    static double *buf_pointer = NULL;\n\t//    static npy_int curbuffer = 0;\n\t//    if(curbuffer==0)\n\t//    {\n\t//        if(rand_buffer) Py_DECREF(rand_buffer);\n\t//        py::tuple args(1);\n\t//        args[0] = BUFFER_SIZE;\n\t//        rand_buffer = (PyArrayObject *)PyArray_FromAny(_namespace_numpy_rand.call(args),\n\t//                                                       NULL, 1, 1, 0, NULL);\n\t//        buf_pointer = (double*)PyArray_GETPTR1(rand_buffer, 0);\n\t//    }\n\t//    double number = buf_pointer[curbuffer];\n\t//    curbuffer = curbuffer+1;\n\t//    if (curbuffer == BUFFER_SIZE)\n\t//        // This seems to be safer then using (curbuffer + 1) % BUFFER_SIZE, we might run into\n\t//        // an integer overflow for big networks, otherwise.\n\t//        curbuffer = 0;\n\t//    return number;\n\t//}\n\n\n\t\t\t//// HANDLE DENORMALS ////\n\t\n\n\n\t\t\t//// HASH DEFINES ////\n\t\n\n\n\t\t\t//// POINTERS ////\n\tint* __restrict  _ptr_array_synapses_4_N_incoming = _array_synapses_4_N_incoming;\n\tint* __restrict  _ptr_array_poissongroup_i = _array_poissongroup_i;\n\tint* __restrict  _ptr_array_neurongroup_i = _array_neurongroup_i;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_post = _array_synapses_4__synaptic_post;\n\tint* __restrict  _ptr_array_synapses_4_N_outgoing = _array_synapses_4_N_outgoing;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_pre = _array_synapses_4__synaptic_pre;\n\t_namespace_numpy_rand = _numpy_rand;\n\n\n\n    srand((unsigned int)time(NULL));\n    const int _buffer_size = 1024;\n    int *const _prebuf = new int[_buffer_size];\n    int *const _postbuf = new int[_buffer_size];\n    int *const _synprebuf = new int[1];\n    int *const _synpostbuf = new int[1];\n    int _curbuf = 0;\n\n    // scalar code\n\tconst intrray_neurongroup_1_s_ext;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_gaba = _array_neurongroup_1_s_gaba;\n\tdouble* __restrict  _ptr_array_neurongroup_1_v = _array_neurongroup_1_v;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_tot_ampa = _array_neurongroup_1_s_tot_ampa;\n\n\n\n\t//// MAIN CODE ////////////\n\n\t// scalar code\n\tconst int _vectorisation_idx = 1;\n \t\n const double _lio_const_1 = - dt;\n const double _lio_const_2 = - G_ampa;\n const double _lio_const_3 = - E_ampa;\n const double _lio_const_4 = - E_gaba;\n const double _lio_const_5 = - E_nmda;\n const double _lio_const_6 = - a;\n const double _lio_const_7 = - El_i;\n\n\n\tfor(int _idx=0; _idx<N; _idx++)\n\t{\n\t    // vector code\n\t\tconst int _vectorisation_idx = _idx;\n      \t\t    \n      const double s_tot_ampa = _ptr_array_neurongroup_1_s_tot_ampa[_idx];\n      double s_ext = _ptr_array_neurongroup_1_s_ext[_idx];\n      double s_gaba = _ptr_array_neurongroup_1_s_gaba[_idx];\n      const double s_tot_nmda = _ptr_array_neurongroup_1_s_tot_nmda[_idx];\n      double v = _ptr_array_neurongroup_1_v[_idx];\n      const double lastspike = _ptr_array_neurongroup_1_lastspike[_idx];\n      bool not_refractory = _ptr_array_neurongroup_1_not_refractory[_idx];\n      not_refractory = (t - lastspike) > tr_i;\n      const double __k_s_ext = (_lio_const_1 * s_ext) / t_ampa;\n      const double __k_s_gaba = (_lio_const_1 * s_gaba) / t_gaba;\n      const double __k_v = ((dt * ((((((_lio_const_2 * s_tot_ampa) * (_lio_const_3 + v)) - ((G_ext * s_ext) * (_lio_const_3 + v))) - ((G_gaba * s_gaba) * (_lio_const_4 + v))) - (((G_nmda * s_tot_nmda) * (_lio_const_5 + v)) / ((b * exp(_lio_const_6 * v)) + 1.0))) - (gl_i * (_lio_const_7 + v)))) * int_(not_refractory)) / C_m;\n      const double _s_ext = ((_lio_const_1 * ((0.5 * __k_s_ext) + s_ext)) / t_ampa) + s_ext;\n      const double _s_gaba = ((_lio_const_1 * ((0.5 * __k_s_gaba) + s_gaba)) / t_gaba) + s_gaba;\n      const double _v = v + (((dt * ((((((_lio_const_2 * s_tot_ampa) * ((_lio_const_3 + (0.5 * __k_v)) + v)) - ((G_ext * ((0.5 * __k_s_ext) + s_ext)) * ((_lio_const_3 + (0.5 * __k_v)) + v))) - ((G_gaba * ((0.5 * __k_s_gaba) + s_gaba)) * ((_lio_const_4 + (0.5 * __k_v)) + v))) - (((G_nmda * s_tot_nmda) * ((_lio_const_5 + (0.5 * __k_v)) + v)) / ((b * exp(_lio_const_6 * ((0.5 * __k_v) + v))) + 1.0))) - (gl_i * ((_lio_const_7 + (0.5 * __k_v)) + v)))) * int_(not_refractory)) / C_m);\n      s_ext = _s_ext;\n      s_gaba = _s_gaba;\n      if(not_refractory)\n          v = _v;\n      _ptr_array_neurongroup_1_s_gaba[_idx] = s_gaba;\n      _ptr_array_neurongroup_1_v[_idx] = v;\n      _ptr_array_neurongroup_1_s_ext[_idx] = s_ext;\n      _ptr_array_neurongroup_1_not_refractory[_idx] = not_refractory;\n\n\n\t}\n\n/*\nThe following code is just compiler options for the call to weave.inline.\nBy including them here, we force a recompile if the compiler options change,\nwhich is a good thing (e.g. switching -ffast-math on and off).\n\nsupport_code:\n  \t\t\n  int int_(const bool value)\n  {\n      return value ? 1 : 0;\n  }\n\n\n\n\ncompiler:\ngcc\n\nextra_compile_args:\n['-w', '-O3']\n\ninclude_dirs:\n['/usr/local/anaconda/include']\n*/\n        ", (119808, 66)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ^
SyntaxError: invalid syntax

我在那个疯狂的字符串中注意到 inline 输出是我之前模拟的变量 运行:例如,s_gaba。 (引发错误的 inline 调用中没有模拟。)这些数据的某些存储应该被删除的问题是否仍然存在?我该如何避免这个错误?

我在官方weave tutorial中找到了一些提示。具体来说,

I use verbose sometimes for debugging. When set to 2, it’ll output all the information (including the name of the .cpp file) that you’d expect from running a make file. This is nice if you need to examine the generated code to see where things are going haywire. Note that error messages from failed compiles are printed to the screen even if verbose is set to 0.

The following example demonstrates using gcc instead of the standard msvc compiler on windows using same code fragment as above. Because the example has already been compiled, the force=1 flag is needed to make inline() ignore the previously compiled version and recompile using gcc.

设置 verbose=2force=1,我得到以下信息:

In [3]: weave.inline('int x=0;', [], compiler='gcc', headers=

['<algorithm>', '<limits>'], extra_compile_args=['-w', '-03'], verbose=2, force=1)
<weave: compiling>
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b
running build_ext
running build_src
build_src
building extension "sc_302644cc5257b9feebbfde0f5856848e1" sources
build_src: building npy-pkg config files
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
building 'sc_302644cc5257b9feebbfde0f5856848e1' extension
compiling C++ sources
C compiler: g++ -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -fPIC

creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy/python27_compiled
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx
compile options: '-I/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave -I/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx -I/usr/local/anaconda/lib/python2.7/site-packages/numpy/core/include -I/usr/local/anaconda-1.9.2/include/python2.7 -c'
extra options: '-w -03'
g++: /home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.cpp
g++: unrecognized option '-03'
g++: /usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.cpp
g++: unrecognized option '-03'
g++ -pthread -shared /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.o /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.o -L/usr/local/anaconda-1.9.2/lib -lpython2.7 -o /home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.so
  File "<string>", line 1
    '\t\t\t\t// SUPPORT CODE\n\t//static py::object _namespace_numpy_rand;\n\t//#define BUFFER_SIZE 1024\n\t//// A rand() function that returns a single random number. Internally\n\t//// it asks numpy\'s rand function for BUFFER_SIZE\n\t//// random numbers at a time and then returns one number from this\n\t//// buffer.\n\t//// It needs a reference to the numpy_rand object (the original numpy\n\t//// function), because this is otherwise only available in\n\t//// compiled_function (where is is automatically handled by weave).\n\t////\n\t//double _rand(const int _vectorisation_idx) {\n\t//    // the _vectorisation_idx argument is unused for now, it could in\n\t//    // principle be used to get reproducible random numbers when using\n\t//    // OpenMP etc.\n\t//    static PyArrayObject *rand_buffer = NULL;\n\t//    static double *buf_pointer = NULL;\n\t//    static npy_int curbuffer = 0;\n\t//    if(curbuffer==0)\n\t//    {\n\t//        if(rand_buffer) Py_DECREF(rand_buffer);\n\t//        py::tuple args(1);\n\t//        args[0] = BUFFER_SIZE;\n\t//        rand_buffer = (PyArrayObject *)PyArray_FromAny(_namespace_numpy_rand.call(args),\n\t//                                                       NULL, 1, 1, 0, NULL);\n\t//        buf_pointer = (double*)PyArray_GETPTR1(rand_buffer, 0);\n\t//    }\n\t//    double number = buf_pointer[curbuffer];\n\t//    curbuffer = curbuffer+1;\n\t//    if (curbuffer == BUFFER_SIZE)\n\t//        // This seems to be safer then using (curbuffer + 1) % BUFFER_SIZE, we might run into\n\t//        // an integer overflow for big networks, otherwise.\n\t//        curbuffer = 0;\n\t//    return number;\n\t//}\n\n\n\t\t\t//// HANDLE DENORMALS ////\n\t\n\n\n\t\t\t//// HASH DEFINES ////\n\t\n\n\n\t\t\t//// POINTERS ////\n\tint* __restrict  _ptr_array_synapses_4_N_incoming = _array_synapses_4_N_incoming;\n\tint* __restrict  _ptr_array_poissongroup_i = _array_poissongroup_i;\n\tint* __restrict  _ptr_array_neurongroup_i = _array_neurongroup_i;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_post = _array_synapses_4__synaptic_post;\n\tint* __restrict  _ptr_array_synapses_4_N_outgoing = _array_synapses_4_N_outgoing;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_pre = _array_synapses_4__synaptic_pre;\n\t_namespace_numpy_rand = _numpy_rand;\n\n\n\n    srand((unsigned int)time(NULL));\n    const int _buffer_size = 1024;\n    int *const _prebuf = new int[_buffer_size];\n    int *const _postbuf = new int[_buffer_size];\n    int *const _synprebuf = new int[1];\n    int *const _synpostbuf = new int[1];\n    int _curbuf = 0;\n\n    // scalar code\n\tconst intrray_neurongroup_1_s_ext;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_gaba = _array_neurongroup_1_s_gaba;\n\tdouble* __restrict  _ptr_array_neurongroup_1_v = _array_neurongroup_1_v;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_tot_ampa = _array_neurongroup_1_s_tot_ampa;\n\n\n\n\t//// MAIN CODE ////////////\n\n\t// scalar code\n\tconst int _vectorisation_idx = 1;\n \t\n const double _lio_const_1 = - dt;\n const double _lio_const_2 = - G_ampa;\n const double _lio_const_3 = - E_ampa;\n const double _lio_const_4 = - E_gaba;\n const double _lio_const_5 = - E_nmda;\n const double _lio_const_6 = - a;\n const double _lio_const_7 = - El_i;\n\n\n\tfor(int _idx=0; _idx<N; _idx++)\n\t{\n\t    // vector code\n\t\tconst int _vectorisation_idx = _idx;\n      \t\t    \n      const double s_tot_ampa = _ptr_array_neurongroup_1_s_tot_ampa[_idx];\n      double s_ext = _ptr_array_neurongroup_1_s_ext[_idx];\n      double s_gaba = _ptr_array_neurongroup_1_s_gaba[_idx];\n      const double s_tot_nmda = _ptr_array_neurongroup_1_s_tot_nmda[_idx];\n      double v = _ptr_array_neurongroup_1_v[_idx];\n      const double lastspike = _ptr_array_neurongroup_1_lastspike[_idx];\n      bool not_refractory = _ptr_array_neurongroup_1_not_refractory[_idx];\n      not_refractory = (t - lastspike) > tr_i;\n      const double __k_s_ext = (_lio_const_1 * s_ext) / t_ampa;\n      const double __k_s_gaba = (_lio_const_1 * s_gaba) / t_gaba;\n      const double __k_v = ((dt * ((((((_lio_const_2 * s_tot_ampa) * (_lio_const_3 + v)) - ((G_ext * s_ext) * (_lio_const_3 + v))) - ((G_gaba * s_gaba) * (_lio_const_4 + v))) - (((G_nmda * s_tot_nmda) * (_lio_const_5 + v)) / ((b * exp(_lio_const_6 * v)) + 1.0))) - (gl_i * (_lio_const_7 + v)))) * int_(not_refractory)) / C_m;\n      const double _s_ext = ((_lio_const_1 * ((0.5 * __k_s_ext) + s_ext)) / t_ampa) + s_ext;\n      const double _s_gaba = ((_lio_const_1 * ((0.5 * __k_s_gaba) + s_gaba)) / t_gaba) + s_gaba;\n      const double _v = v + (((dt * ((((((_lio_const_2 * s_tot_ampa) * ((_lio_const_3 + (0.5 * __k_v)) + v)) - ((G_ext * ((0.5 * __k_s_ext) + s_ext)) * ((_lio_const_3 + (0.5 * __k_v)) + v))) - ((G_gaba * ((0.5 * __k_s_gaba) + s_gaba)) * ((_lio_const_4 + (0.5 * __k_v)) + v))) - (((G_nmda * s_tot_nmda) * ((_lio_const_5 + (0.5 * __k_v)) + v)) / ((b * exp(_lio_const_6 * ((0.5 * __k_v) + v))) + 1.0))) - (gl_i * ((_lio_const_7 + (0.5 * __k_v)) + v)))) * int_(not_refractory)) / C_m);\n      s_ext = _s_ext;\n      s_gaba = _s_gaba;\n      if(not_refractory)\n          v = _v;\n      _ptr_array_neurongroup_1_s_gaba[_idx] = s_gaba;\n      _ptr_array_neurongroup_1_v[_idx] = v;\n      _ptr_array_neurongroup_1_s_ext[_idx] = s_ext;\n      _ptr_array_neurongroup_1_not_refractory[_idx] = not_refractory;\n\n\n\t}\n\n/*\nThe following code is just compiler options for the call to weave.inline.\nBy including them here, we force a recompile if the compiler options change,\nwhich is a good thing (e.g. switching -ffast-math on and off).\n\nsupport_code:\n  \t\t\n  int int_(const bool value)\n  {\n      return value ? 1 : 0;\n  }\n\n\n\n\ncompiler:\ngcc\n\nextra_compile_args:\n['-w', '-O3']\n\ninclude_dirs:\n['/usr/local/anaconda/include']\n*/\n        ", (119808, 66)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ^
SyntaxError: invalid syntax

让我突然想到的是我的主目录中存在一个缓存:/home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.cpp

删除此缓存中的所有内容(即 $ rm -r ~/.cache/scipy)可解决问题。没有了 SyntaxError!