Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 Directories but seems not to 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:\Amarth\Programing\CPlusPlusLearning\Release\CPlusPlusLearning.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:\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 ==========

That seems obvious as the compiler can only find the function declaration but can't find the definition... Besides, according to the similar questions I've seen, most people solved the problem after adding 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:\Users\Amarthgul\Anaconda3, which is also added to system variable > 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:\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"  
like image 878
Amarth Gûl Avatar asked Jun 14 '17 00:06

Amarth Gûl


1 Answers

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("\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;
             }
};
like image 93
CarpeDiemKopi Avatar answered Oct 01 '22 00:10

CarpeDiemKopi