初次使用Cython的遇到问题
程序所在目录必须全英
- 刚开始照着网上的示例写了一个文件,结果一直出现:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb2 in position 18: ordinalnot in range(128) - 然后我尝试将两个文件都改为utf8,仍然出错,结果一样:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb2 in position 18: ordinalnot in range(128) - 我又以为py文件里没有写 #coding=utf-8 ,添加后,结果还是一样:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb2 in position 18: ordinalnot in range(128)
以上都尝试过后,网上又找到更改默认编码的方法:
import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
尝试后结果还是一样。之后我仔细看了一下错误提示,说道’UnicodeDecodeError‘,于是我将文件改为Unicode,尝试之后报错的结果是变了,但是还是没有成功。报错如下:
Cython.Compiler.Errors.CompileError:最后,我猜测可能是安装的Cython没有对中文目录进行处理,导致编码方式不对。将文件移到一个全英的目录再次运行,就会看到提示正在建立库。用install命令安装后,import该包后就可以运行了。
Unable to find vcvarsall.bat
这个问题也困扰了我好久。网上找方法,看着都好复杂。尤其是一个在命令行改用set设置VS90COMNTOOLS=%VS110COMNTOOLS%的方法,很坑!提示要在安装前设置,于是我就先后安装再卸载了无数次,都以失败告终。
重点内容其中还有一个方法提到直接修改,Python27\Lib\distutils目录下的cygwinccompiler.py文件,也犹豫了半天要不要更改,很怕给改坏了。有人提示直接改第二百多行的那个VERSION就行,好像有点道理。我后来将源码文件分析了一下,最后确实只改了一行,只不过和他说的不是同一行。
具体操作如下:
首先,打开Python27\Lib\distutils目录下的cygwinccompiler.py文件,找到关键字majorVersion,将其值改为你VisualStudio的版本,版本号可以看你安装目录。我的是2015版本号是14,就将其赋值为14。
然后,还需要更改注册表中的值。按住Win+R,输入regedit打开注册表编辑器,找到如下目录\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\Setup 其中14.0就是你VS的版本。在Setup目录下找到VC,可能没有这个目录,手动添加一个项命名为VC就好。然后在VC下再创建一个字符串值,名称为productdir(majorVersion.py源码文件中出现的),数值为 你 VS中VC的目录如:E:\Soft\Microsoft Visual Studio 14.0\VC,关闭注册表,重新运行示例代码。错误消失了。
参考示例文件如下
创建hello.pyx,内容如下
def say_hello():
print "Hello World!"
创建setup.py,内容如下
from distutils.core import setup
from Cython.Build import cythonize
setup(name = 'Hello world app',
ext_modules = cythonize("hello.pyx"))
在同目录下打开cmd命令行,运行如下命令:
python setup.py build
python setup.py install
最后进入Python命令窗口,输入如下命令:
>>> import hello
>>> hello.say_hello()
就会看到熟悉的 Hello World!