Может быть возможно выделить немного памяти в python, а затем передать указатель на ваш код C ++, чтобы он мог выгружать данные прямо там.

рабатываю программу, которая использует DirectShow для захвата аудиоданных из медиа-файлов. DirectShow использует поток для передачи аудиоданных в функцию обратного вызова в моей программе, и я позволил этой функции обратного вызова вызвать другую функцию в Python.

Я использую Boost.Python, чтобы обернуть мою библиотеку, функцию обратного вызова:

class PythonCallback {
private:
    object m_Function;
public:
    PythonCallback(object obj)
        : m_Function(obj)
    {}

    void operator() (double time, const AudioData &data) {
        // Call the callback function in python
        m_Function(time, data);
    }

};

Здесь возникает проблема, поток DirectShow вызывает мой PythonCallback, а именно вызывает функцию в Python. Как только он вызывает, моя программа просто падает. Я обнаружил, что это должно быть проблемой с многопоточностью. Тогда я нашел этот документ:

http://docs.python.org/c-api/init.html

Кажется, что моя программа не может напрямую вызывать функцию Python из потока, потому что есть глобальная блокировка интерпретатора. GIL Python настолько сложен, что я понятия не имею, как он работает. Извините, я могу спросить. Мой вопрос Что я должен делать до и после вызова функции Python из потоков?

Это может выглядеть так

void operator() (double time, const AudioData &data) {
    // acquire lock
    m_Function(time, data);
    // release lock
}

Благодарю. Виктор Лин.