在Windows x64中运行Cython - 致命错误C1083:无法打开包含文件:“basetsd.h”:没有那个文件或目录。

46

我一直在尝试在Windows 7系统上为Python 2.7安装Cython,特别是我希望全部使用64位。(如果您想知道的话,我需要Cython是因为它是我需要用于某些专业数值分析的另一个软件包的组成部分。并且x64对于存储大型数据集可能是一个优势。)

所以我从官方网站下载了x64 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.batvcvars64.batvcvars86_amd64.batvcvarsx86_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。我收到了相同的错误信息。


希望这个能帮到你:https://dev59.com/sHE85IYBdhLWcg3wXCIv#10558328 - Mehraban
嗨SAM,我知道变量VS90COMNTOOLS。实际上,在去到VS90COMNTOOLS之前,Cython会先搜索VC目录。至少在构建的初始步骤中,Cython能够像问题描述中所述地找到VC组件。不过还是谢谢你。 - Argyll
你是否检查过以下内容:(a)文件是否已安装在正确的位置,(b)编译器是否使用/showincludes包含了所需内容,最后(c)确认该项未被编译器指令隐藏?如果你查看cl.exe帮助文档 /? ,那么你应该能够获得更详细的信息。 - Preet Sangha
嗨,Preet,我刚发现basetsd.hwindows.h(在构建C++程序页面中提到的另一个头文件)都没有。不知道为什么。 - Argyll
6个回答

50

如果有人现在(2017 年)遇到与 Visual C++ 2015 工具相关的错误,请再次启动安装程序,并根据您的操作系统选择 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,甚至 web 开发框架,如 flask。


4
我已经在Windows 7上选择了Win8.1选项,pandas已经成功构建。谢谢。 - Winand
1
这对我在32位Windows 10上安装Geemusic requirements.txt有所帮助。在安装了Windows 10 SDK之后,它可以正常工作。谢谢 ;) - Volodymyr Kotylo
2
具体来说,安装Windows头文件选项有所帮助! - tonysepia
1
2018年。我简直不敢相信,但安装win 10 sdk 64位解决了我的basestd.h问题,并让我成功安装了scikit-image。 - jonincanada
1
2021年。我也不敢相信,但安装win 10 sdk 64解决了我的basestd.h问题,并让我安装了pybullet。 - AverageHomosapien
显示剩余4条评论

23

我在尝试以“开发”模式安装pandas时遇到了这个问题。但现在我已经可以正常运行了。我的环境如下:

  • Windows XP Pro x64 SP2
  • WinPython 64bit 2.7.5.3 (Python 2.7.5.amd64) <-- 使用 WinPython 控制面板应用程序“注册”为系统的 Python 发行版

运行python setup.py develop时遇到的问题:

  • 无法找到 vcvarsall.bat
  • Fatal error C1083: 无法打开包括文件:'basetsd.h':没有那个文件或目录...退出代码2

解决方案:

  1. 下载并安装Microsoft Visual C++ 2008 Express。
  2. 下载并安装Microsoft Windows SDK for Windows 7和.NET Framework 3.5 SP1。您只需要:
    • 开发人员工具>Windows头文件和库 <-- 这会给您basetsd.h
    • 开发人员工具>Visual C++编译器 <-- 这会给您64位编译器
  3. 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。注意文件名的更改。
  4. 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 tag。

[编辑] 进一步阅读:


太棒了。顺便问一下,你知道在哪里或如何直接下载适用于Windows 7的Windows SDK而不是使用Web安装程序吗? - Lucas Soares
抱歉 @LucasSoares,我不知道你可以在哪里找到那个。 - patricktokeeffe

22

如果你使用的是 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文件放置在系统正确的文件夹中来解决问题。


Anaconda + Windows 数据中心服务器 - 这是唯一可行的解决方案。以下是实际错误信息:找到可执行文件 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe geometry.c c:\programdata\anaconda3\include\pyconfig.h(222): 致命错误 C1083: 无法打开包括文件: 'basetsd.h': 没有那个文件或目录。 - MPV
2
这很有用,但我还需要复制rcdll.dll文件,否则我会得到一个link.exe失败的错误语句。请参见https://dev59.com/gFcP5IYBdhLWcg3wxMw5#44563421 - Jon
没有为我解决问题。 - Dmitry
谢谢!我试图运行“pip install twofish”,但是错误导致我来到这里,解决了问题! - Neophear
多年以后 - 是的,完美,这也为我解决了问题的一部分,谢谢! - kowalski5233
显示剩余2条评论

1
将这些路径添加到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

希望这能解决问题。


2
虽然这些目录确实存在,但对我没有帮助。 - Joshua Burns

1

对于建议,您可以尝试使用setup.py构建Cython 64位版本

我正在使用Anaconda作为Python分发工具,Microsoft的Windopws SDK 7和MSVC 12.0。

首先,我为我的cuda函数制作库, 其次,我运行python setup.py build_ext -i以创建临时文件夹(您将会得到错误), 然后编译下面的Makefile,

大多数情况下,当setup.py编译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%你的文件名_WO_Ext%
  • "/OUT:E:\my_cuda.pyd"用于确定输出位置、文件名及其扩展名。

0

我可以通过从以下链接下载并安装最新的Windows 10 SDK来解决这个问题: https://software-download.microsoft.com/download/pr/19041.685.201201-2105.vb_release_svc_prod1_WindowsSDK.iso

但是,接着又出现了一个与(cpython)相关的问题:

error C2039: 'exc_type': is not a member of '_ts'

我可以通过在声明中添加额外的指针来解决这个问题。

(...\python38\include\cpython\pystate.h)

我在第77行找到了这些内容:
/* The exception currently being raised */
PyObject *curexc_type;
PyObject *curexc_value;
PyObject *curexc_traceback;

然后我在它们之后添加以下内容(不包括前三个字母“cur”):

/* The exception currently being raised */
PyObject *exc_type;
PyObject *exc_value;
PyObject *exc_traceback;

不得不重命名Python头文件的内部细节表明您已经搞砸了什么。我猜你正在使用一个不兼容Python 3.8的三年前的Cython版本。__你的“解决方案”并不是一个解决方案,你应该预期你的程序会以意想不到的方式崩溃__。 - DavidW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接