您的位置:首页 > 编程语言 > Python开发

解决Cython在Window下Python2.7中:Unable to find vcvarsall.bat的问题

2017-05-18 22:40 615 查看

初次使用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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python cython ascii