diff --git a/IPython/extensions/cythonmagic.py b/IPython/extensions/cythonmagic.py
index be8f808..a9c0432 100644
--- a/IPython/extensions/cythonmagic.py
+++ b/IPython/extensions/cythonmagic.py
@@ -15,6 +15,7 @@ Parts of this code were taken from Cython.inline.
 # The full license is in the file COPYING.txt, distributed with this software.
 #-----------------------------------------------------------------------------
 
+import io
 import os, sys
 from importlib import import_module
 import imp
@@ -32,6 +33,7 @@ from IPython.testing.skipdoctest import skip_doctest
 from IPython.core.magic_arguments import (
     argument, magic_arguments, parse_argstring
 )
+from IPython.utils import py3compat
 
 import Cython
 from Cython.Compiler.Errors import CompileError
@@ -90,7 +92,7 @@ class CythonMagics(Magics):
         if not module_name:
             raise ValueError('module name must be given')
         fname = module_name + '.pyx'
-        with io.open(fname, 'w', encoding='utf-8'):
+        with io.open(fname, 'w', encoding='utf-8') as f:
             f.write(cell)
         if 'pyximport' not in sys.modules:
             import pyximport
@@ -125,8 +127,7 @@ class CythonMagics(Magics):
         """
         args = parse_argstring(self.cython, line)
         code = cell if cell.endswith('\n') else cell+'\n'
-        # distutils.Extension cannot handle sources that a unicode
-        lib_dir=str(os.path.join(self.shell.ipython_dir,'cython'))
+        lib_dir=os.path.join(self.shell.ipython_dir, 'cython')
         cython_include_dirs=['.']
         force=args.force
         quiet=True
@@ -146,9 +147,9 @@ class CythonMagics(Magics):
                 import numpy
                 c_include_dirs.append(numpy.get_include())
             pyx_file = os.path.join(lib_dir, module_name + '.pyx')
-            with io.open(pyx_file, 'w', encoding='utf-8'):
+            pyx_file = py3compat.unicode_to_str(pyx_file, encoding=sys.getfilesystemencoding())
+            with io.open(pyx_file, 'w', encoding='utf-8') as f:
                 f.write(code)
-            print [pyx_file]
             extension = Extension(
                 name = module_name,
                 sources = [pyx_file],
diff --git a/IPython/extensions/tests/test_cythonmagic.py b/IPython/extensions/tests/test_cythonmagic.py
index beb5da8..2092b0e 100644
--- a/IPython/extensions/tests/test_cythonmagic.py
+++ b/IPython/extensions/tests/test_cythonmagic.py
@@ -4,10 +4,11 @@
 import os
 import nose.tools as nt
 
+from IPython.utils import py3compat
 
-code = """def f(x):
+code = py3compat.str_to_unicode("""def f(x):
     return 2*x
-"""
+""")
 
 try:
     import Cython
@@ -39,7 +40,8 @@ def test_cython():
     ip = get_ipython()
     ip.run_cell_magic('cython', '', code)
     ip.ex('g = f(10)')
-    nt.assert_equals(ip.user_ns['g'], 20.0)        
+    nt.assert_equals(ip.user_ns['g'], 20.0)
+    
 
 
 
diff --git a/IPython/testing/iptest.py b/IPython/testing/iptest.py
index 6bbde36..4af2e93 100644
--- a/IPython/testing/iptest.py
+++ b/IPython/testing/iptest.py
@@ -148,6 +148,7 @@ have['wx'] = test_for('wx')
 have['wx.aui'] = test_for('wx.aui')
 have['qt'] = test_for('IPython.external.qt')
 have['sqlite3'] = test_for('sqlite3')
+have['cython'] = test_for('Cython')
 
 have['tornado'] = test_for('tornado.version_info', (2,1,0), callback=None)
 
@@ -268,6 +269,9 @@ def make_exclude():
                            ipjoin('zmq', 'pylab'),
         ])
 
+    if not have['cython']:
+        exclusions.extend([ipjoin('extensions', 'cythonmagic')])
+
     if not have['tornado']:
         exclusions.append(ipjoin('frontend', 'html'))
 
diff --git a/docs/source/config/extensions/cythonmagic.txt b/docs/source/config/extensions/cythonmagic.txt
new file mode 100644
index 0000000..f6b76fb
--- /dev/null
+++ b/docs/source/config/extensions/cythonmagic.txt
@@ -0,0 +1,7 @@
+.. _extensions_cythonmagic:
+
+===========
+cythonmagic
+===========
+
+.. automodule:: IPython.extensions.cythonmagic
diff --git a/docs/source/config/extensions/index.txt b/docs/source/config/extensions/index.txt
index 300a751..4004ba3 100644
--- a/docs/source/config/extensions/index.txt
+++ b/docs/source/config/extensions/index.txt
@@ -71,6 +71,7 @@ Extensions bundled with IPython
    :maxdepth: 1
 
    autoreload
+   cythonmagic
    parallelmagic
    storemagic
    sympyprinting