Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
732 views
in Technique[技术] by (71.8m points)

c++ - can't include Python.h in visual studio

(I do find a lot of similar questions, but so far non of these fits me...)

===========Updated error message, images, Command Line===========

I am trying to #include <Python.h>(that's nearly all the code, the main function is almost empty yet) in visual studio, but it keeps reminding me cannot open source file "Python.h", if I run the program, it will raise an error:

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

. I added the include and library directories in project Property Pages > VC++ Directories, not working, tried to add the path to C/C++ > Additional Include Directories, not working, and I tried to change it to release mode, still not working...

VC++ C/C++

=================Update 2.0================

I add %(AdditionalIncludeDirectories); to C/C++ > Additional Include Directoriesbut seems not work.

Then I did something really stupid: I copied the headers and .dll to the header include folder... Now it doesn't remind me can't find Python.h any longer, I can code:

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

but it won't compile... I got a new error message:

'"C:AmarthProgramingCPlusPlusLearningReleaseCPlusPlusLearning.exe"' is not recognized as an internal or external command,
operable program or batch file.

And in Output, it's:

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:AmarthComputer_GraphicsProgramingCPlusPlusLearningReleaseCPlusPlusLearning.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

That seems obvious as the compiler can only find function declaration but can't find the definition... Besides, according to the similar questions I've seen, most people solved the problem after add the include directories. So if I'm really facing a fancy problem, will it be possible to find and copy all the function definitions then make it work in some way ?

==============OTHER MESSAGES===============

I'm using python 3.5, installed by Anaconda. The include and libs folder is under C:UsersAmarthgulAnaconda3, which is also added to system vaiable > path. There's also a Python 3.6 in my computer, but normally I only use its Manuals, and yet it haven't cause any trouble in python environment. Command Line:

/GS /GL /W3 /Gy /Zc:wchar_t /I"C:UsersAmarthgulAnaconda3include" /Zi /Gm- /O2 /sdl /Fd"x64Releasevc140.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64Release" /EHsc /nologo /Fo"x64Release" /Fp"x64ReleaseCPlusPlusLearning.pch"  
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In Visual Studio Community 2015 I changed the "Active solution configuration" in Build Configuration Manager from 'Debug' to 'Release. That solved this problem for me.

I got my following example code from: Tutorial Python embedded in C++

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


int main()
{
    CPyInstance pyInstance;

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

    printf("
Press any key to exit...
");
    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;
             }
};

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...