Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 More Python Embedding Trouble
I'm trying to run a basic C/Python API, I am using Python3.6

My Python File Looks like
import numpy as np
#import random
class Multiply:
    def __init__(self):
        self.x = 2
        self.y = 2
        self.a = 0

    def multiply(self):
        self.a = self.x * self.y
        print("Result of: {} * {}".format(self.x,self.y))
        return self.a

My C File Looks Like
#include </usr/include/python3.6m/Python.h>
#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
    PyObject *pName, *pModule, *pClass;
    PyObject  *pValue, *pDict, *pInstance;

    int i, arg[2];


    PyRun_SimpleString("import sys");

    pName = PyUnicode_DecodeFSDefault("with_numpy_import");
    pModule = PyImport_Import(pName);
    pDict = PyModule_GetDict(pModule);

    pClass = PyDict_GetItemString(pDict, "Multiply");


    if (PyCallable_Check(pClass)){
    pInstance = PyObject_CallObject(pClass, NULL);

    if( argc > 4 ){
      for (i = 0; i < argc - 4; i++){
          arg[i] = atoi(argv[i + 4]);

      pValue = PyObject_CallMethod(pInstance, argv[3], "(ii)", arg[0], arg[1]);

      pValue = PyObject_CallMethod(pInstance, "multiply", NULL);

  if(pValue != NULL){
      printf("Return of call : %d\n", PyLong_AsLong(pValue));

  // Clean up


  //////// Start Over ////////


  PyRun_SimpleString("import sys");

  pName = PyUnicode_DecodeFSDefault("with_numpy_import");
  pModule = PyImport_Import(pName);

  return 0;

Why do I get a segmentation error when I import numpy? I can import random and it runs perfectly fine after I comment out import numpy. I have observed that this segmentation error occurs when I use modules that have been brought in with pip.

Is it safe to assume I can run Py_Initialize(); and Py_Finalize(); multiple times in one program?

Please advise. Confused
It could be related to the Bugs and Caveats section in the documentation of Py_FinalizeEx(). Try to use Py_Initialize() and Py_Finalize() only once to see if it changes anything.
If I only call Py_Initialize() and Py_Finalize() once it works, but is there a reason why Py_Initialize() and Py_Finalize() can't be called twice? It works with import random?
The Python Documentation Wrote:Bugs and caveats: The destruction of modules and objects in modules is done in random order; this may cause destructors (__del__() methods) to fail when they depend on other objects (even functions) or modules. Dynamically loaded extension modules loaded by Python are not unloaded. Small amounts of memory allocated by the Python interpreter may not be freed (if you find a leak, please report it). Memory tied up in circular references between objects is not freed. Some memory allocated by extension modules may not be freed. Some extensions may not work properly if their initialization routine is called more than once; this can happen if an application calls Py_Initialize() and Py_FinalizeEx() more than once.

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  Need help merging/embedding duckredbeard 10 347 Aug-13-2020, 04:48 AM
Last Post: duckredbeard
  Embedding return in a print statement Tapster 3 394 Oct-07-2019, 03:10 PM
Last Post: Tapster
  Calling Extended Embedding Python as shared library jibarra 0 472 Jul-19-2019, 05:22 PM
Last Post: jibarra
  Python Embedding jibarra 4 782 Jul-11-2019, 03:25 PM
Last Post: jibarra
  Embedding or adding IDE like "repl" inside Flask app sray 1 474 Jul-03-2019, 03:13 PM
Last Post: nilamo
  Embedding Python into a simulator siggi 0 707 Apr-24-2019, 07:42 PM
Last Post: siggi
  Embedding, windows, and virtual environments mariofutire 0 1,046 Sep-14-2018, 10:30 AM
Last Post: mariofutire
  [CPP] Embedding Python and use GDB Razazel 4 2,286 Nov-12-2017, 05:59 PM
Last Post: Razazel
  Embedding Args in external program call brizflysdrones 5 2,297 May-09-2017, 08:29 PM
Last Post: buran

Forum Jump:

Users browsing this thread: 1 Guest(s)