在Windows x64上运行Cython - 致命错误C1083: 无法打开包含文件: 'basetsd.h': 没有这样的文件或目录
我一直在尝试在我的Windows 7系统上安装Python 2.7的Cython。特别是,我希望一切都能是64位的。(如果你想知道,我需要Cython是因为它是我进行一些专业数值分析所需的另一个软件包的组成部分。而64位可能在存储大数据集时有优势。)
所以我从官方网站下载了64位的Python 2.7。从Christoph Gohlke那里获取了Cython,当然是针对Python 2.7的amd64版本。在安装之前,我用Joe DF的回答中的 .reg
文件把Python 2.7添加到了注册表中。之后,我从这里安装了Visual C++编译器(我觉得这个不太好用),还有这里的这个应该可以用。到目前为止,我在我的C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
目录下找到了所有的vcvars32.bat
、vcvars64.bat
、vcvars86_amd64.bat
和vcvarsx86_ia64.bat
。我运行了vcvars64.bat
,没有出现错误信息。
接着,我按照这个页面的说明创建了一个“hello world”的测试文件。
然后,我遇到了这个错误。
...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
error: Unable to find vcvarsall.bat
所以我心想:Cython找不到那个文件,因为它根本不存在。(我在整个硬盘上搜索过这个文件。)于是我把vcvars64.bat
从...\VC\bin
复制到\VC
,并把名字改成vcvarsall.bat
。现在vcvarsall的错误消失了。但是……自然又出现了一个新错误。
...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64\cl.exe /c /nolog
o /Ox /MD /W3 /GS- /DNDEBUG -IC:\Python27\include -IC:\Python27\PC /Tchello.c /F
obuild\temp.win-amd64-2.7\Release\hello.obj
hello.c
C:\Python27\include\pyconfig.h(227) : fatal error C1083: Cannot open include fil
e: 'basetsd.h': No such file or directory
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\amd64
\cl.exe"' failed with exit status 2
现在我不知道该怎么继续了。我该怎么办?非常感谢你的帮助。
(为了更清楚,我确实尝试过把编译器设置为Mingw32。但出现了其他错误。我现在专注于让VC工作。)
编辑:我尝试按照这个页面的说明使用SDK构建环境的CMD。结果收到了同样的错误。
6 个回答
把这些路径添加到你的Visual Studio安装目录的环境变量里
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools
希望这样能解决问题。
关于建议,你可以尝试用setup.py来构建64位的cython。
我使用的是Anaconda来管理Python,微软的Windows SDK 7,还有MSVC 12.0。
首先,我为我的cuda函数创建一个库,
然后,我运行命令python setup.py build_ext -i来生成一个临时文件夹(你可能会遇到错误),
接着编译下面的Makefile。
大多数情况下,我是从setup.py中获取这个Makefile的,最开始是为了编译32位的应用程序,然后我修改它来编译64位的。
Makefile
CL_EXE = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\cl.exe"
LINK_EXE = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\link.exe"
CL_FLAGS = /c /nologo /Ox /MD /W3 /GS- /DNDEBUG /O2 /fp:fast
CL_INC = -I. -I"C:\Program Files\Microsoft SDKs\Windows\v7.1\Include" \
-I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include" -IC:\Users\name\Anaconda2\envs\py27\Lib\site-packages\numpy\core\include -IC:\Users\name\Anaconda2\envs\py27\include -IC:\Users\name\Anaconda2\envs\py27\PC
LINK_FLAGS = /DLL /nologo /INCREMENTAL:NO /MACHINE:X64
LINK_LIBPATH = "/LIBPATH:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64" \
/LIBPATH:C:\Users\name\Anaconda2\envs\py27\libs \
/LIBPATH:C:\Users\name\Anaconda2\envs\py27\PCbuild\amd64 \
/LIBPATH:C:\Users\name\Anaconda2\envs\py27\PC\VS9.0\amd64 \
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64" \
"/LIBPATH:C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64"
LINK_LIB = cuda_multiply4D.lib cudart.lib MSVCRT.lib kernel32.lib
LINK_EXPORT = /EXPORT:initmy_cuda
LINK_OBJ = build\temp.win-amd64-2.7\Release\my_cuda.obj
LINK_OUT = "/OUT:E:\my_cuda.pyd"
LINK_OTHER_CONF = /IMPLIB:build\temp.win-amd64-2.7\Release\my_cuda.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\my_cuda.pyd.manifest
all:
$(CL_EXE) $(CL_FLAGS) $(CL_INC) /Tcmy_cuda.c /Fobuild\temp.win-amd64-2.7\Release\my_cuda.obj
$(LINK_EXE) $(LINK_FLAGS) $(LINK_LIBPATH) $(LINK_LIB) $(LINK_EXPORT) $(LINK_OBJ) $(LINK_OUT) $(LINK_OTHER_CONF)
注意:
- MSVCRT.lib和kernel32.lib是可选的,
- /EXPORT:initmy_cuda是必须的。它的格式是init%你的文件名_去掉扩展名%
- "/OUT:E:\my_cuda.pyd"用于确定你的输出位置、文件名和扩展名。
对于使用Windows 10的朋友,可以从这里下载SDK,以修复头文件basestd.h
。
我下载了这个.exe文件,安装后运行得很好。SDK大约有2.3GB。
注意:如果你和我一样是64位系统,并且遇到了额外的错误:
`LINK : fatal error LNK1158: cannot run 'rc.exe'
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1158
这里有一个很好的答案在这里,它通过将rc.exe
文件放到你系统的正确文件夹中来解决这个问题。
我在尝试以“开发”模式安装 pandas
时遇到了这个问题。现在我已经解决了。我的环境如下:
- Windows XP 专业版 x64 SP2
- WinPython 64位 2.7.5.3(Python 2.7.5.amd64)
<--
通过 WinPython 控制面板应用程序“注册”为系统的 Python 发行版
在运行 python setup.py develop
时遇到的问题:
- 找不到 vcvarsall.bat
- 致命错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录 ... 退出代码 2
解决方案:
- 下载 并安装 Microsoft Visual C++ 2008 Express。
- 下载 并安装 Microsoft Windows SDK for Windows 7 和 .NET Framework 3.5 SP1。你只需要选择:
- 开发工具 > Windows 头文件和库
<--
这会给你basetsd.h
- 开发工具 > Visual C++ 编译器
<--
这会给你 64 位编译器
- 开发工具 > Windows 头文件和库
- 将
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat
复制到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat
。注意文件名的变化。 - 将
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
添加到PATH
中。这可能不是必须的(我是在重新安装带有头文件和库的 SDK 之前这样做的,因此是否必要还不确定)。
到此为止,运行 python setup.py develop
成功完成,运行 python -c "import pandas; print pandas.__version__"
得到了我预期的 git 标签。
[编辑] 进一步阅读:
如果你在使用Visual C++ 2015工具时遇到同样的错误(这是在2017年说的),可以重新启动安装程序,并根据你的操作系统选择Windows 8.1或10的SDK。这可以解决basestd.h
的错误。
如果这样还是不行,可以尝试从这个路径启动构建工具:C:\Program Files (x86)\Microsoft Visual C++ Build Tools。
另外一个选择是直接安装Anaconda 2或3(如果你不想遇到内存错误,建议选择64位版本)。它里面已经包含了很多重要的包,比如:sklearn、matplotlib、scipy、numpy、pandas,甚至还有像flask这样的网页开发框架。