迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

解决C++ 中 - 'Python.h': No such file or directory 错误

作者:迹忆客 最近更新:2023/08/22 浏览次数:

本文将解释如何解决错误“Python.h”:没有这样的文件或目录。 当我们尝试在 C++ 中嵌入 Python 代码,但编译器无法在系统内部找到对 Python 的引用时,通常会发生这种情况。


C++ 中 'Python.h': No such file or directory 错误的原因

下面是一个使用 Python 代码的 C++ 程序。

#include <stdio.h>
#include <conio.h>
#include <Python.h>

int main()
{
    PyObject* pInt;

    Py_Initialize();

    PyRun_SimpleString("print('Hello World from Embedded Python!!!')");

    Py_Finalize();

    printf("\nPress any key to exit...\n");
    if (!_getch()) _getch();
    return 0;
}

当编译该程序时,它给出错误 'Python.h': No such file or directory

Build started...
1>------ Build started: Project: Python into Cpp, Configuration: Debug x64 ------
1>1.cpp
1>C:\Users\Win 10\source\repos\Python into Cpp\1.cpp(3,10): fatal error C1083: Cannot open include file: 'Python.h': No such file or directory
1>Done building project "Python into Cpp.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

导致 'Python.h': No such file or directory 的多种原因

  1. 系统内部未安装Python。

    Python 是第三方企业软件,不附带标准 Windows 和 C++ 编译器安装。 它必须使用正确的设置进行安装并链接到 C++ 编译器。

  2. C++ 编译器找不到 Python。

    如果编译器通过 IDE 或 mingw4 运行,它只能检测到标准 C++ 包含标准安装附带的包。

    需要将第三方库添加到 IDE 包含文件和链接器文件中。

    解决上述问题需要执行三个步骤。

    1. 自定义安装 Python,使其能够嵌入 IDE 中。
    2. 将 Python 路径添加到 IDE 包含和链接器路径。
    3. 在 C++ 代码中编写 Python 代码并编译它们。

允许将其代码嵌入 C++ 中的 Python 安装

如果系统内没有Python,或者安装并链接了Python,但仍然出现错误 'Python.h': No such file or directory,这是因为Python安装没有下载调试二进制文件。

建议正确卸载Python,然后重新安装,以解决错误 'Python.h': No such file or directory

前往 Python 网站并下载最新的 Python 版本。 如果需要某个版本,请前往所有版本下载部分。

本文演示了 Windows 操作系统中的步骤,因此合适的选择是使用 Windows 安装程序(64 位或 32 位)。 如果使用现代 PC,建议使用 64 位版本。

下载完成后,运行安装程序,然后选择自定义安装。 “立即安装”选项将使用默认设置安装 Python,但保留调试二进制文件以允许将其嵌入到 IDE 中。

勾选要求将 Python X.X(版本)添加到 PATH 的框,然后单击“自定义安装”。

定制安装

在下一页上,标记所有框,然后单击下一步。

可选功能

在第三个菜单中,勾选“下载调试二进制文件”框,然后单击“安装”。 Python 将安装在所选目录中。

调试库


将 Python 路径添加到 IDE 的包含和链接器的步骤

任何标准安装中未附带 C++ 的第三方库都必须引用 IDE。 IDE无法自动搜索和检测系统内部的第三方库。

这就是导致错误“Python.h”的原因:没有这样的文件或目录。

虽然当包库存储在 C++ 脚本所在的同一目录中时 IDE 可以搜索文件,但应在程序的 #include<> 标头中提及其路径。

但以这种方式存储依赖项是一种不好的做法。

需要做的是,库的路径应该链接到 IDE,以便可以以包含标准头文件的方式包含它,而无需提供源代码的文件路径。

任何标准安装中未附带 C++ 的第三方库都必须引用 IDE。 IDE无法自动搜索和检测系统内部的第三方库。

这就是导致错误“Python.h”的原因:没有这样的文件或目录。

首先,需要一个IDE。 建议使用 Visual Studio(2017 或更高版本),本文将介绍相同的内容。

也可以使用任何其他 IDE,大多数步骤都是相同的,但 Visual Studio 使其变得简单。

在系统中安装Visual Studio

Visual Studio 的安装程序可以从这里下载。 下载64位社区版本后,安装软件,包括C++开发选项。

安装完成后,创建一个新项目。

对于以前从未使用过 Visual Studio 的读者来说,该窗口可能看起来有些吓人,但无需担心。 大多数需要的功能都在前面,本文将指导其余的功能。

创建一个项目,并为其命名,例如“Python in cpp”。 项目创建后,主窗口将如下所示:

主窗口

如果只是黑屏,请按 Ctrl+Alt+l,解决方案资源管理器将打开。 解决方案资源管理器显示该项目可用的所有文件和依赖项。


添加要包含的 Python 路径和链接器

在此步骤中,将包含 Python 路径并将其链接到 Visual Studio,以便 IDE 知道在写入 #include <python.h> 时要查找的位置。

此步骤的先决条件是了解 Python 的安装目录并使其在另一个窗口中保持打开状态。 现在转到“调试”>“项目名称”>“属性”(它将显示项目的名称,而不是项目名称)。

项目属性

在项目属性窗口中,转到 C/C++ > 常规 > 其他包含目录,单击最右侧的小下拉按钮,然后单击 <编辑...>。

C++ 通用

将打开“附加包含目录”对话框。 在这里,双击第一个空白处,粘贴系统内Python安装目录中的include文件夹的路径,然后单击“确定”。

附加包含目录

添加包含目录的路径后,转到“链接器”>“常规”>“其他库目录”。 与上一步一样,单击<编辑...>。

其他类库

现在,libs 文件夹应该添加到链接器中。 该文件夹也可以在包含文件夹所在的 Python 目录中找到。

添加后,单击“确定”,然后单击“应用”。

添加lib文件夹


用 C++ 编写 Python 代码并编译它们

添加包含路径和链接器路径后,必须编译示例程序来检查上述步骤是否正确执行,并且不会再遇到 “Python.h”: No such file or directory 错误。

转到解决方案资源管理器并右键单击源文件。 单击“添加”>“新项目”,为文件命名并单击“添加”。

这个新文件将包含将要编译的代码。

下面是本文开头使用的引发错误的 C++ 程序。

#include <stdio.h>
#include <conio.h>
#include <Python.h>

int main()
{
    PyObject* pInt;

    Py_Initialize();

    PyRun_SimpleString("print('Hello World from Embedded Python!!!')");

    Py_Finalize();

    printf("\nPress any key to exit...\n");
    if (!_getch()) _getch();
    return 0;
}

现在,当通过单击顶部的绿色播放按钮编译文件时,我们得到输出:

Hello World from Embedded Python!!!

Press any key to exit...

总结

本文解释了解决错误 “Python.h”: No such file or directory 的步骤。 读完本文后,读者可以安装Python和Visual Studio并将它们链接到Python库。

上一篇:C++ 子类继承

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 子类继承

发布时间:2023/08/22 浏览次数:93 分类:C++

继承是 OOP 的一个特性,其中一个类获取另一个类的属性和行为。 继承另一个类的类称为子类,而其属性被继承的类称为基类。本文将讨论继承类时出现的钻石问题。

C++ 调用基类方法

发布时间:2023/08/22 浏览次数:118 分类:C++

本文将讨论使用 C++ 从子类调用父类方法。 首先,我们将快速刷新继承。稍后我们将讨论不同场景下调用基类方法以及相关问题。

检查C++中的链表是否为空

发布时间:2023/08/22 浏览次数:127 分类:C++

链表具有多个动态分配的节点,其中包含一个值和一个指针。 本教程将教您三种在 C++ 中检查链表是否为空的方法。C++ 中使用根元素检查链表是否为空 链表中的根充当一个元素,即使链表为空

C++ 中的移动语义

发布时间:2023/08/22 浏览次数:160 分类:C++

在本文中,我们将讨论 C++ 中的移动语义:我们将讨论深拷贝和浅拷贝的相关概念 我们将快速讨论左值和右值的概念。 我们将尝试通过示例来理解移动语义。

在 C++ 中抛出异常

发布时间:2023/08/21 浏览次数:200 分类:C++

C++抛出异常是C++的一个强大功能,可用于处理错误和意外事件。 它主要用于终止程序的执行或将控制权转移到程序的不同部分。在 C++ 中抛出异常

C++ 中抛出超出范围的异常

发布时间:2023/08/21 浏览次数:176 分类:C++

This article discusses how to throw an out of range exception in C++. It also discusses the possible errors while throwing out of range exception in C++.

在 C++ 中抛出异常消息

发布时间:2023/08/21 浏览次数:192 分类:C++

它是通过在程序中可能出现问题的地方抛出异常来执行的。 C++ 中有几个异常处理关键字,但本文将介绍如何使用可变消息引发异常。使用标准 C++ 异常抛出带有消息的异常 - 无效参数

C++ 中的 A Declaration Shadows a Parameter 错误

发布时间:2023/08/21 浏览次数:188 分类:C++

每个对象或变量总是有一些边界、范围或作用域来访问其他类成员,例如由 C++ 中的访问说明符定义为 public、private 或 protected 的数据成员或成员函数。当我们在程序的特定范围或块中多次定义

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便