我已经下载并运行make来安装sage,但是当我尝试在ipython notebook中运行以下代码时,由于无法正确导入Sage程序的方法,我收到很多错误消息:

%load_ext cythonmagic


接着

%%cython

include "sage/gsl/gsl.pxi"

cdef double do_callback(double x, void* params):
    return (<MyCallback>params).eval(x)

cdef class MyCallback:
    cdef double a
    def __init__(self, a):
        self.a = a
    cpdef double eval(self, double x):
        print "eval", x, self.a * x * x
        return self.a * x * x
    def call_gsl(self):
        cdef gsl_integration_workspace* w =
gsl_integration_workspace_alloc (1000)

        cdef gsl_function F
        F.function = &do_callback
        F.params = <void*>self

        cdef double result, error
        gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, w, &result, &error);
        print result, error

        gsl_integration_workspace_free(w)


错误是:

InternalError                             Traceback (most recent call last)
<ipython-input-3-3bcbbcb051de> in <module>()
----> 1 get_ipython().run_cell_magic(u'cython', u'', u'include "sage/gsl/gsl.pxi" \n\ncdef double do_callback(double x, void* params): \n    (<MyCallback>params).eval(x) \n\ncdef class MyCallback: \n    cdef double a \n    def __init__(self, a): \n        self.a = a \n    cpdef double eval(self, double x): \n        print "eval", x, self.a * x * x \n        return self.a * x * x \n    def call_gsl(self): \n        cdef gsl_integration_workspace* w = \ngsl_integration_workspace_alloc (1000) \n\n        cdef gsl_function F \n        F.function = &do_callback \n        F.params = <void*>self \n\n        cdef double result, error \n        gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, w, &result, &error); \n        print result, error \n\n        gsl_integration_workspace_free(w) ')

/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc in run_cell_magic(self, magic_name, line, cell)
   2127             magic_arg_s = self.var_expand(line, stack_depth)
   2128             with self.builtin_trap:
-> 2129                 result = fn(magic_arg_s, cell)
   2130             return result
   2131

/anaconda/lib/python2.7/site-packages/IPython/extensions/cythonmagic.pyc in cython(self, line, cell)

/anaconda/lib/python2.7/site-packages/IPython/core/magic.pyc in <lambda>(f, *a, **k)
    189     # but it's overkill for just that one bit of state.
    190     def magic_deco(arg):
--> 191         call = lambda f, *a, **k: f(*a, **k)
    192
    193         if callable(arg):

/anaconda/lib/python2.7/site-packages/IPython/extensions/cythonmagic.pyc in cython(self, line, cell)
    242                     force = True,
    243                     )
--> 244                 build_extension.extensions = cythonize([extension], **opts)
    245             except CompileError:
    246                 return

/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/Cython/Build/Dependencies.pyc in cythonize(module_list, exclude, nthreads, aliases, quiet, force, exclude_failures, **options)
    692         quiet=quiet,
    693         exclude_failures=exclude_failures,
--> 694         aliases=aliases)
    695     deps = create_dependency_tree(ctx, quiet=quiet)
    696     build_dir = getattr(options, 'build_dir', None)

/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/Cython/Build/Dependencies.pyc in create_extension_list(patterns, exclude, ctx, aliases, quiet, exclude_failures)
    618             if module_name not in seen:
    619                 try:
--> 620                     kwds = deps.distutils_info(file, aliases, base).values
    621                 except Exception:
    622                     if exclude_failures:

/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/Cython/Build/Dependencies.pyc in distutils_info(self, filename, aliases, base)
    528
    529     def distutils_info(self, filename, aliases=None, base=None):
--> 530         return (self.transitive_merge(filename, self.distutils_info0, DistutilsInfo.merge)
    531             .subs(aliases)
    532             .merge(base))

/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/Cython/Compiler/Main.pyc in find_include_file(self, filename, pos)
    217                                                include=True)
    218         if not path:
--> 219             error(pos, "'%s' not found" % filename)
    220         return path
    221

/anaconda/lib/python2.7/site-packages/Cython-0.20.1-py2.7-linux-x86_64.egg/Cython/Compiler/Errors.pyc in error(position, message)
    165     #print "Errors.error:", repr(position), repr(message) ###
    166     if position is None:
--> 167         raise InternalError(message)
    168     err = CompileError(position, message)
    169     if DebugFlags.debug_exception_on_error: raise Exception(err) # debug

InternalError: Internal compiler error: 'sage/gsl/gsl.pxi' not found


有什么想法可能会帮助它起作用吗?

最佳答案

我自己不使用Sage内的IPython笔记本,而且我不是Cython专家,所以请带一点盐。 (希望那些做过并且做得到的人会看到这一点-还有更多的here。)但是,如果从from sage.all import *开始会有所帮助,我不会感到惊讶。我不知道您可以像您尝试的那样仅包含一个随机标头。事实证明,导入一小部分Sage并不是一件容易的事。在某种程度上是有目的的。

关于python - 使用ipython使鼠尾草工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24532549/

10-13 05:30