将变量从Python传递给C

时间:2015-01-15 10:13:34

标签: python c variables embed

我在C中嵌入了Python脚本,我在一个线程中运行。我需要传递变量' a'来自Python-Class' Detect Motion'我的C程序不断。 (不作为返回值) 我知道我可以用fifo或类似的东西做到这一点,但有没有办法将它直接传递给C,也许是通过调用C函数?

C:

#include <Python.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <pthread.h>
pthread_t mythread;
void *ThreadProc();

PyObject *pName, *pModule, *pDict, *pFunc, *pFunc2;

int main(int argc, char *argv[])
{

    py_callback = PyCFunction_New(&callback_descr, NULL);


    char *script = "motion";
    char *functionUse = "get_values";

    Py_Initialize();
    pName = PyString_FromString(script);
    pModule = PyImport_Import(pName);
    // pDict and pFunc are borrowed references 
    pDict = PyModule_GetDict(pModule);
    pFunc = PyDict_GetItemString(pDict, functionUse);

    // POSIX code
    pthread_create( &mythread, NULL, ThreadProc, NULL);

    // Random testing code
    for(int i = 0; i < 10; i++)
    {
        printf("Printed from the main thread.\n");
        sleep(1);
    }

    printf("Main Thread waiting for My Thread to complete...\n");

    // Join and wait for the created thread to complete...
    // POSIX code
    pthread_join(mythread, NULL);

    printf("Main thread finished gracefully.\n");

    return 0;
}

void *ThreadProc()
{
    if (PyCallable_Check(pFunc)) 
    {
        PyObject_CallObject(pFunc, NULL);
    }
    else {
        PyErr_Print();
    }

    // Clean up
    Py_DECREF(pModule);
    Py_DECREF(pName);

    Py_Finalize();
    printf("My thread is finishing...\n");
}

的Python:

import numpy as np
import picamera
import picamera.array

class DetectMotion(picamera.array.PiMotionAnalysis):
    def analyse(self, a):
            a = np.sqrt(
            np.square(a['x'].astype(np.float)) +
            np.square(a['y'].astype(np.float))
            ).clip(0, 255).astype(np.uint8)
            # If there're more than 10 vectors with a magnitude greater
            # than 60, then say we've detected motion
            print a 
            if (a > 60).sum() > 10:
                print 'Motion detected!'

def get_values():
    with picamera.PiCamera() as camera:
        with DetectMotion(camera) as output:
            camera.resolution = (640, 480)
            camera.start_preview()
            camera.start_recording(
                '/dev/null', format='h264', motion_output=output)
            camera.wait_recording(10)
            camera.stop_recording()
            camera.stop_preview()

0 个答案:

没有答案