在 Windows x64 中运行 Cython - 致命错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录

Posted

技术标签:

【中文标题】在 Windows x64 中运行 Cython - 致命错误 C1083:无法打开包含文件:\'basetsd.h\':没有这样的文件或目录【英文标题】:Running Cython in Windows x64 - fatal error C1083: Cannot open include file: 'basetsd.h': No such file or directory在 Windows x64 中运行 Cython - 致命错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录 【发布时间】:2022-01-07 03:51:31 【问题描述】:

我一直在尝试在我的 Window 7 系统上安装 Cython for Python 2.7。特别是,我更喜欢 64 位的所有内容。 (如果您想知道,我需要 Cython,因为 Cython 是我在另一个软件包中需要的组件之一,用于一些专门的数值分析。x64 可能是存储大型数据集的优势。)

于是我从官网下载了x64 Python 2.7。从Christoph Gohlke 获得 Cython。当然是 Python 2.7 的 amd64 版本。在安装之前,我将 Python 2.7 添加到注册表中,并在 Joe DF's answer here 中找到了 .reg 文件。之后,我从here(我认为它不起作用)和here(但这个应该)安装了Visual C++ 编译器。此时,我的C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin 目录中有所有vcvars32.batvcvars64.batvcvars86_amd64.batvcvarsx86_ia64.bat。我跑了vcvars64.bat,没有错误信息。

随后,我跟着this page创建了一个“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 工作。)


编辑:我尝试按照this page 上的说明使用 SDK 构建环境 CMD。我收到了同样的错误。

【问题讨论】:

我希望this 有所帮助。 嗨 SAM,我知道变量 VS90COMNTOOLS。 Cython 实际上先搜索 VC 目录,然后再转到 VS90COMNTOOLS。并且至少在构建的初始步骤中,Cython 能够按照问题文本中的描述定位 VC 组件。不过谢谢。 您是否检查过 (a) 文件是否已安装以及安装在何处以及 (b) 编译器使用 /showincludes 包含哪些内容,最后 (c) 验证该项目没有被编译器指令隐藏?如果你检查 cl.exe 帮助 /?那么您应该能够使内容更加冗长。 嗨,Preet,我刚刚发现 basetsd.hwindows.h(构建 C++ 程序页面中提到的另一个头文件。msdn.microsoft.com/en-us/library/z7kx322x.aspx)我想知道为什么 【参考方案1】:

我在尝试以“开发”模式安装 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 致命错误C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录...退出代码2

解决办法:

    Download 并安装 Microsoft Visual C++ 2008 Express。 Download 并安装适用于 Windows 7 和 .NET Framework 3.5 SP1 的 Microsoft Windows SDK。您将只需要: 开发者工具 > Windows 头文件和库<-- 这给了你basetsd.h 开发人员工具 > Visual C++ 编译器 <-- 这为您提供了 64 位编译器 复制C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.batC:\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。这可能不是必需的(我在重新安装带有 Headers & Libs 的 SDK 之前这样做了;因此,必要性未知)。

此时,运行python setup.py develop 成功完成,python -c "import pandas; print pandas.__version__" 产生了我预期的 git 标签。

[编辑]进一步阅读:

error: Unable to find vcvarsall.bat answer if you just want binaries to install answer if you want to compile on x64 machine answer about the file location/name change distutils issue 7511

【讨论】:

太棒了。在相关的说明中,您知道在哪里\如何在没有 Web 安装程序的情况下直接下载 Windows SDK for Windows 7? 对不起@LucasSoares 我不知道你在哪里可以找到【参考方案2】:

如需建议,您可以尝试使用 setup.py 构建 cython 64 位

我正在使用 Anaconda 进行 python 分发、Microsoft 的 Windopws SDK 7 和 MSVC 12.0。

首先,我为我的 cuda 函数创建库, 其次,我运行 python setup.py build_ext -i for make temp 文件夹(你会得到错误), 然后在下面编译Makefile,

大多数情况下,当它编译 32 位应用程序时,我从 setup.py 得到这个,然后将其更改为编译 64 位。

生成文件

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%yourfilename_WO_Ext% "/OUT:E:\my_cuda.pyd" 用于确定您的输出位置、文件名和扩展名。

【讨论】:

【参考方案3】:

如果目前(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 开发框架。

【讨论】:

我在 Windows 7 上选择了 win8.1 选项。pandas 已构建良好。谢谢。 这帮助我使用 32 位 Windows 10 安装 Geemusic requirements.txt。在我安装 Windows 10 SDK 后工作。谢谢;) 专门安装 Windows headers 选项有帮助! 2018.我不敢相信,但安装 win 10 sdk 64 修复了我的 basestd.h 问题并让我安装 scikit-image 2021.我也不敢相信,但安装 win 10 sdk 64 修复了我的 basestd.h 问题并让我安装 pybullet【参考方案4】:

对于那些使用 Windows 10 的用户,请从 here 下载 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

here 有一个很好的答案,它通过将 rc.exe 文件放在您系统的正确文件夹中来解决问题。

【讨论】:

Anaconda + windows 数据中心服务器 - 这是唯一有效的解决方案。这是实际错误:找到可执行文件 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe geometry.cc:\programdata\anaconda3\include\pyconfig.h(222): fatal错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录 这很有用,但我还需要复制 rcdll.dll 文件,否则我会收到 link.exe failed 错误语句。见***.com/a/44563421/8195528 没有为我修复( 该死的,真烦人!很高兴它现在有效。谢谢朋友,非常感谢您的链接。 谢谢!我试图运行“pip install twofish”,错误将我带到这里,这解决了问题!【参考方案5】:

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

希望它能解决问题。

【讨论】:

虽然这些目录确实存在,但对我没有帮助【参考方案6】:

我可以通过从这个链接下载并安装最新的 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 不兼容的 3 年旧版本的 Cython。 您的“解决方案”不是解决方案,您应该期望您的程序以意想不到的方式中断

以上是关于在 Windows x64 中运行 Cython - 致命错误 C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Windows 编译 cymunk?

如何在Windows 2012 r2 x64上运行jenkins slave?

C# WinForms 使用 FlashLight 内置到运行 Windows 10 Professional x64 的移动设备中

armwin11怎么在x64电脑运行

Windows 7 x64上的Delphi问题?

无法在 Windows 7 x64 上使用 VB 脚本中的 CreateObject