Article Index

 

 

Page 53

#define PY_SSIZE_T_CLEAN

#include <Python.h>

static PyObject * add(PyObject *self, PyObject *args)

{

    int x, y, sts;

    if (!PyArg_ParseTuple(args, "ii", &x, &y))

        return NULL;

    sts = x+y;

    return PyLong_FromLong(sts);

}

static PyMethodDef AddMethods[] = {

    {"add", add, METH_VARARGS, "add two numbers"},

    {NULL, NULL, 0, NULL} // sentinel

};

static struct PyModuleDef addmodule = {

  PyModuleDef_HEAD_INIT,

  "arith",                              

  "C library for sum",  

  -1,                                  

  AddMethods                          

};

PyMODINIT_FUNC PyInit_arith(void) {    

     return PyModule_Create(&addmodule);

}

Page 54 and on

Arith.c

#define PY_SSIZE_T_CLEAN

#include <Python.h>

static PyObject * Pi(PyObject *self, PyObject *args)

{

    int m, n;

    double pi,s;

    if (!PyArg_ParseTuple(args, "ii", &m, &n))

        return NULL;

    pi=0;

    for(int k=m;k<n;k++){

        s=1;

        if(k%2==0)s=-1;

        pi=pi+s/(2*k-1);

    }    

    return PyFloat_FromDouble(4*pi);

}

static PyMethodDef AddMethods[] = {

    {"myPi", Pi, METH_VARARGS, "Compute Pi"},

    {NULL, NULL, 0, NULL} // sentinel

};

static struct PyModuleDef addmodule = {

  PyModuleDef_HEAD_INIT,

  "Pi",                              

  "C library to compute Pi",  

  -1,                                  

  AddMethods                          

};

PyMODINIT_FUNC PyInit_Pi(void) {    

     return PyModule_Create(&addmodule);

}

tasks.json   LINUX

{

    "tasks": [

        {

            "type": "cppbuild",

            "label": "C/C++: gcc-10 build active file",

            "command": "/usr/bin/gcc-10",

            "args": [

                "-fdiagnostics-color=always",

                "-g",

                "-shared",

                "${file}",

                "-o",

                "Pi.so",

                "-I/usr/local/include/python3.11"  

            ],

            "options": {

                "cwd": "${fileDirname}"

            },

            "problemMatcher": [

                "$gcc"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            },

            "detail": "Task generated by Debugger."

        }

    ],

    "version": "2.0.0"

}

c_cpp_properties.json LINUX

{

    "configurations": [

        {

            "name": "Linux",

            "includePath": [

                "${workspaceFolder}/**",

                "/usr/local/include/**"

            ],

            "defines": [],

            "compilerPath": "/usr/bin/gcc",

            "cStandard": "c17",

            "cppStandard": "gnu++14",

            "intelliSenseMode": "linux-gcc-arm"

        }

    ],

    "version": 4

}

launch.json LINUX

{

    "version": "0.2.0",

    "configurations": [

      {

          "name": "Python: Current File",

          "type": "python",

          "request": "launch",

          "program": "${file}",

          "console": "integratedTerminal"

      },

      {

          "name": "(gdb) Attach",

          "type": "cppdbg",

          "request": "attach",

          "program": "/usr/local/bin/python3.11",

          "processId": "${command:pickProcess}",

          "MIMode": "gdb",

          "setupCommands": [

              {

                  "description": "Enable pretty-printing for gdb",

                  "text": "-enable-pretty-printing",

                  "ignoreFailures": true

              }

          ]

      }

    ]

  }

tasks.json   WINDOWS - CHANGE USER IN PATH

{

    "tasks": [

        {

            "type": "cppbuild",

            "label": "C/C++: cl.exe build active file",

            "command": "cl.exe",

            "args": [

                "/Zi",

                "/EHsc",

                "/nologo",            

                "/IC:/Users/mike.james/AppData/Local/Programs/Python/Python311/include",              

                "${file}",

                "/link /dll /OUT:arith.pyd /LIBPATH:C:/Users/mike.james/AppData/Local/Programs/Python/Python311/libs"

            ],

            "options": {

                "cwd": "${fileDirname}"

            },

            "problemMatcher": [

                "$msCompile"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            },

            "detail": "Task generated by Debugger."

        }

    ],

    "version": "2.0.0"

}

 c_cpp_properties.json WINDOWS CHANGE USER IN PATH

{

    "configurations": [

        {

            "name": "Win32",

            "includePath": [

                "${workspaceFolder}/**",

                "C:/Users/mike.james/AppData/Local/Programs/Python/Python311/include/"

            ],

            "defines": [

                "_DEBUG",

                "UNICODE",

                "_UNICODE"

            ],

            "windowsSdkVersion": "10.0.22000.0",

            "compilerPath": "cl.exe",

            "cStandard": "c17",

            "cppStandard": "c++17",

            "intelliSenseMode": "windows-msvc-x64"

        }

    ],

    "version": 4

}

launch.json WINDOWS CHANGE USER IN PATH 

{

    "version": "0.2.0",

    "configurations": [

        {

            "name": "(Windows) Attach",

            "type": "cppvsdbg",

            "request": "attach",

            "processId": "${command:pickProcess}",

            "symbolSearchPath": "C:/Users/mike.james/AppData/Local/Programs/Python/Python-3.11.4",

            "sourceFileMap":{"D:/a/1/s/":"C:/Users/mike.james/AppData/Local/Programs/Python/Python311"},

        },

        {

            "name": "Python: Current File",

            "type": "python",

            "request": "launch",

            "program": "${file}",

            "console": "integratedTerminal"

        }

    ]

}

Py.py

import time

def myPi(m,n):

    pi=0

    for k in range(m,n+1):

        s= 1 if k%2 else -1

        pi += s / (2 * k - 1)

    return 4*pi

if __name__ == '__main__':

    N=10000000

    t1=time.perf_counter()

    pi=myPi(1,N)

    t2=time.perf_counter()

    print((t2-t1)*1000)

    print(pi)

Py1.py

import Pi

import time

if __name__ == '__main__':

    N=10000000

    t1=time.perf_counter()

    pi=Pi.myPi(1,N)

    t2=time.perf_counter()

    print((t2-t1)*1000)

    print(pi)

Page 57

example.c

#define PY_SSIZE_T_CLEAN

#include <Python.h>

static PyObject* exampleFunction(PyObject *self, PyObject *args)

{  

     //example function code

}

static PyMethodDef AddMethods[] = {

    {"exampleFunction", exampleFunction, METH_VARARGS, "an example"},

    {NULL, NULL, 0, NULL} // sentinel

};

static struct PyModuleDef addmodule = {

  PyModuleDef_HEAD_INIT,

  "example",                              

  "C library to test API",  

  -1,                                  

  AddMethods                          

};

PyMODINIT_FUNC PyInit_example(void) {    

     return PyModule_Create(&addmodule);

}

tasks.json LINUX

{

    "tasks": [

        {

            "type": "cppbuild",

            "label": "C/C++: gcc-10 build active file",

            "command": "/usr/bin/gcc-10",

            "args": [

                "-fdiagnostics-color=always",

                "-g",

                "-shared",

                "${file}",

                "-o",

                "example.so",

                "-I/usr/local/include/python3.11"  

            ],

            "options": {

                "cwd": "${fileDirname}"

            },

            "problemMatcher": [

                "$gcc"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            },

            "detail": "Task generated by Debugger."

        }

    ],

    "version": "2.0.0"

}

launch.json LINUX

{

    "version": "0.2.0",

    "configurations": [

      {

          "name": "Python: Current File",

          "type": "python",

          "request": "launch",

          "program": "${file}",

          "console": "integratedTerminal"

      },

      {

          "name": "(gdb) Attach",

          "type": "cppdbg",

          "request": "attach",

          "program": "/usr/local/bin/python3.11",

          "processId": "${command:pickProcess}",

          "MIMode": "gdb",

          "setupCommands": [

              {

                  "description": "Enable pretty-printing for gdb",

                  "text": "-enable-pretty-printing",

                  "ignoreFailures": true

              }

          ]

      }

    ]

  }

c_cpp_properties.json LINUX

{

    "configurations": [

        {

            "name": "Linux",

            "includePath": [

                "${workspaceFolder}/**",

                "/usr/local/include/**"

            ],

            "defines": [],

            "compilerPath": "/usr/bin/gcc",

            "cStandard": "c17",

            "cppStandard": "gnu++14",

            "intelliSenseMode": "linux-gcc-arm"

        }

    ],

    "version": 4

}

tasks.json   WINDOWS - CHANGE USER IN PATH

{

    "tasks": [

        {

            "type": "cppbuild",

            "label": "C/C++: cl.exe build active file",

            "command": "cl.exe",

            "args": [

                "/Zi",

                "/EHsc",

                "/nologo",            

                "/IC:/Users/mike.james/AppData/Local/Programs/Python/Python311/include",              

                "${file}",

                "/link /dll /OUT:example.pyd /LIBPATH:C:/Users/mike.james/AppData/Local/Programs/Python/Python311/libs"

            ],

            "options": {

                "cwd": "${fileDirname}"

            },

            "problemMatcher": [

                "$msCompile"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            },

            "detail": "Task generated by Debugger."

        }

    ],

    "version": "2.0.0"

}

 

 c_cpp_properties.json WINDOWS CHANGE USER IN PATH

{

    "configurations": [

        {

            "name": "Win32",

            "includePath": [

                "${workspaceFolder}/**",

                "C:/Users/mike.james/AppData/Local/Programs/Python/Python311/include/"

            ],

            "defines": [

                "_DEBUG",

                "UNICODE",

                "_UNICODE"

            ],

            "windowsSdkVersion": "10.0.22000.0",

            "compilerPath": "cl.exe",

            "cStandard": "c17",

            "cppStandard": "c++17",

            "intelliSenseMode": "windows-msvc-x64"

        }

    ],

    "version": 4

}

 

launch.json WINDOWS CHANGE USER IN PATH 

{

    "version": "0.2.0",

    "configurations": [

        {

            "name": "(Windows) Attach",

            "type": "cppvsdbg",

            "request": "attach",

            "processId": "${command:pickProcess}",

            "symbolSearchPath": "C:/Users/mike.james/AppData/Local/Programs/Python/Python-3.11.4",

            "sourceFileMap":{"D:/a/1/s/":"C:/Users/mike.james/AppData/Local/Programs/Python/Python311"},

        },

        {

            "name": "Python: Current File",

            "type": "python",

            "request": "launch",

            "program": "${file}",

            "console": "integratedTerminal"

        }

    ]

}