2017-08-21 9 views
0

cythonでセルをコンパイルすると、Jupyterは次のセルでコンパイルされた関数を忘れてしまったようです。これは私にとって正しいことではないようです。何がうまくいかないのですか?JupyterノートブックがCythonを1つのセルから次のセルに「忘れる」のはなぜですか?

セル1:

%load_ext Cython 

セル2:

私はノートブックのバージョン5.0.0を使用しています

、ここで

Python 3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] 

は問題を生じMWEです
%%cython 
cdef int foo(): 
    return 3 

print(foo()) 

このp roduces:次電池では

3 

、私は

print(foo()) 

を持ってこれが生成します。

--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-3-9701608cebc0> in <module>() 
----> 1 print(foo()) 

NameError: name 'foo' is not defined 

答えて

2

を私は(あなたがpythonで利用できるよう、あなたのfoo機能を定義していなかったので、それはだと思いますcpdef)、Cシグニチャ(cdef)だけを与えるので、cythonコードからのみ呼び出すことができます。
あなたはまだcythonコードを使用していますが、セル3では純粋なPythonで戻ってきて機能が利用できないため、セル2で呼び出すことができます。あなたは今、あなたのPythonコードでfoo2()またはfoo3()を呼び出そうとすることができます

%%cython 
# Not reachable in pure python: 
cdef int foo(): 
    return 3 

# Python visible function signature: 
cpdef int foo2(): 
    return 3 

# Or a wrapper around the cython function: 
def foo3(): 
    return foo() 

:pythonでfoo関数から結果を得るために様々な方法があります。

表示されていない場合はdocumentationの関連部分を参照してください。

+0

すばらしい、ありがとう! docポインタもありがとう。私はJupyterでcythonを使うのに役立つドキュメンテーションを見つけるのは一般的に難しいと思っています。私は、私を混乱させるいくつかの謎は、サイモン固有のものの多くが魔法のコマンドに隠されているということです。 –

関連する問題