无法在Visual Studio中包含Python.h

7

我发现了很多类似的问题,但到目前为止,没有一个问题适合我...

===========更新错误信息、图片、命令行===========

我正在尝试在Visual Studio中#include <Python.h>(这几乎是全部代码,主函数几乎为空) ,但它一直提醒我cannot open source file "Python.h",如果我运行程序,它将引发错误:

fatal error C1083: Cannot open include file:'Python.h': No such file or directory

我在项目属性页(Property Pages) > VC++ Directories中添加了包含(include)和库(library)目录,但不起作用。我试着将路径添加到C/C++ > Additional Include Directories,但也不起作用。我还尝试将其更改为发布(release)模式,但仍然无效...

VC++ C/C++

=================更新2.0================

我在C/C++ > Additional Include Directories中添加了%(AdditionalIncludeDirectories);,但似乎没有起作用。

然后我做了一件非常愚蠢的事情:我将头文件和.dll文件复制到头文件包含(include)文件夹中...现在它不再提醒我找不到Python.h,我可以编写代码:

Py_Initialize();
PyRun_SimpleString("print('Hello Python!')");
Py_Finalize();

但是它无法编译...我收到了一个新的错误信息:
'"C:\Amarth\Programing\CPlusPlusLearning\Release\CPlusPlusLearning.exe"' is not recognized as an internal or external command,
operable program or batch file.

在输出中,它是这样的:
1>------ Build started: Project: CPlusPlusLearning, Configuration: Release Win32 ------
1>  PartOne.cpp
1>PartOne.cpp(34): warning C4244: 'argument': conversion from 'double' to 'float', possible loss of data
1>PartOne.obj : error LNK2001: unresolved external symbol __imp__Py_Finalize
1>PartOne.obj : error LNK2001: unresolved external symbol __imp__Py_Initialize
1>PartOne.obj : error LNK2001: unresolved external symbol __imp__PyRun_SimpleStringFlags
1>C:\Amarth\Computer_Graphics\Programing\CPlusPlusLearning\Release\CPlusPlusLearning.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

这似乎很明显,编译器只能找到函数声明但找不到定义... 此外,根据我看到的类似问题,大多数人在添加包含目录后解决了问题。那么如果我真的遇到了一个花哨的问题,是否可能找到并复制所有函数定义,然后以某种方式使其正常工作?
==============其他信息===============
我正在使用由Anaconda安装的Python 3.5。 includelibs文件夹位于C:\Users\Amarthgul\Anaconda3下,也已添加到系统变量 > 路径中。我计算机上还有一个Python 3.6,但通常我只使用它的手册,并且它没有在python环境中造成任何麻烦。命令行:
/GS /GL /W3 /Gy /Zc:wchar_t /I"C:\Users\Amarthgul\Anaconda3\include" /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\CPlusPlusLearning.pch"  

为了帮助回答问题,我建议您编写一个非常简单的 [mcve],并包括构建行(项目属性>C++>命令行)。 - Tas
同时复制粘贴实际的错误信息(省略任何个人信息,如项目文件夹等)抱歉,我无法翻译此内容,因为它是一个指令,而不是需要翻译的文本。请提供需要翻译的具体文本。 - Tas
1
我看到你已经添加了_Release_项目目录。你是在_Release_还是其他配置中构建? - Tas
@TheDark 重新输入了,还是不行...我的参数看起来没问题吗?我发现很多人在添加目录后解决了这个问题... - Amarth Gûl
错误信息改变了吗? - Shihe Zhang
显示剩余7条评论
2个回答

6
在 Visual Studio Community 2015 中,我将“生成\配置管理器”中的“活动解决方案配置”从“Debug”改为“Release”。这个方法解决了我的问题。
我从以下链接获取了示例代码:Python嵌入C++教程
#include <python.h>
#include <stdio.h>
#include <conio.h>


int main()
{
    CPyInstance pyInstance;

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

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

class CPyInstance
{
    public:
    CPyInstance()
    {
        Py_Initialize();
    }

    ~CPyInstance()
    {
        Py_Finalize();
    }
};

class CPyObject
{
    private:
        PyObject* p;
    public:

        CPyObject() : p(NULL)
        { }

        CPyObject(PyObject* _p) : p(_p)
        { }


        ~CPyObject()
        {
            Release();
        }

        PyObject* getObject()
        {
            return p;
        }

        PyObject* setObject(PyObject* _p)
        {
            return (p = _p);
        }

        PyObject* AddRef()
        {
            if (p)
            {
                Py_INCREF(p);
            }
            return p;
        }   

        void Release()
        {
             if (p)
             {
                  Py_DECREF(p);
             }

             p = NULL;
        }

        PyObject* operator ->()
             {
                  return p;
             }

             bool is()
             {
                  return p? true : false;
             }


             operator PyObject* ()
             {
                  return p;
             }

             PyObject* operator = (PyObject* pp)
             {
                  p = pp;
                  return p;
             }


             operator bool()
             {
                 return p ? true : false;
             }
};

1
我尝试了这种方法,但也没有起作用...无论如何还是谢谢。 - Amarth Gûl
你是否有Python的默认环境?它是否适用于你安装的其余部分 - 64位或32位? - CarpeDiemKopi
你的安装中也有这个a-File吗?我的目录是:C:\Program Files\Python35\libs - CarpeDiemKopi
在我上一个评论中,结尾的字符“...\pyt”是一个错误。 - CarpeDiemKopi
你的链接器的“库路径”设置是否正确? - CarpeDiemKopi
显示剩余6条评论

4

奇怪,我也遇到相同的问题。但是我通过将平台更改为“x64”来解决了它。


只有当您运行x64位Python时,此方法才有效。大多数安装都是x32位的,因此此方法将无法使用。 - Xantium
1
这实际上解决了我的问题,非常感谢。 @Simon,当涉及到数据科学时,情况恰好相反,只支持x64(在主要库中),因此人们使用Python的x64版本。 - Hossein

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