Ошибка при импорте керасов во встроенный питон в C

Я пытаюсь встроить Python в мое приложение C. Я загружаю пакет на официальном сайте python и успеваю сделать простой Hello World.

Теперь я хочу пойти глубже и использовать некоторые библиотеки python, такие как numpy, keras, tenorflow...

Я работаю с Python 3.5.4, я установил все необходимые пакеты на моем компьютере с pip3:

pip3 install keras
pip3 install tensorflow
...

Затем я создал свой скрипт и запустил его в среде Python, он отлично работает:

Python:

# Importing the libraries
#
import numpy as np
import pandas as pd

dataset2 = pd.read_csv('I:\RNA\dataset19.csv')
X_test = dataset2.iloc[:, 0:228].values
y_test = dataset2.iloc[:, 228].values

# 2.
import pickle
sc = pickle.load(open('I:\RNA\isVerb_sc', 'rb'))
X_test = sc.transform(X_test)

# 3. 
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

classifier = Sequential()

classifier.add(Dense(units = 114, kernel_initializer = 'uniform', activation = 'relu', input_dim = 228))
classifier.add(Dropout(p = 0.3))

classifier.add(Dense(units = 114, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dropout(p = 0.3))

classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

classifier.load_weights('I:\RNA\isVerb_weights.h5')

y_pred = classifier.predict(X_test)
y_pred1 = (y_pred > 0.5)

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred1)

Но когда я выполняю тот же скрипт в среде C с встраиваемым python, он не работает:

Сначала я безуспешно выполняю свой сценарий непосредственно с PyRun_SimpleFile, поэтому я выделил его в несколько инструкций с помощью PyRun_SimpleString, чтобы обнаружить проблему:

C:

result = PyRun_SimpleString("import numpy as np"); // result = 0 (ok)
result = PyRun_SimpleString("import pandas as pd"); // result = 0 (ok)
...
result = PyRun_SimpleString("import pickle"); // result = 0 (ok)
... (all insctruction above works)
result = PyRun_SimpleString("import keras"); // result = -1 !!
... (all under this failed)

но нет ни одной трассировки стека об этой ошибке, я попробовал это, но я только что получил:

"Вот вывод: (ноль)"

Моя инициализация Python в C кажется правильной, так как другие библиотеки импортируют нормально:

    // Python
    wchar_t *stdProgramName = L"I:\\LIBs\\cpython354";
    Py_SetProgramName(stdProgramName);

    wchar_t *stdPythonHome = L"I:\\LIBs\\cpython354";
    Py_SetPythonHome(stdPythonHome);

    wchar_t *stdlib = L"I:\\LIBs\\cpython354;I:\\LIBs\\cpython354\\Lib\\python35.zip;I:\\LIBs\\cpython354\\Lib;I:\\LIBs\\cpython354\\DLLs;I:\\LIBs\\cpython354\\Lib\\site-packages";
    Py_SetPath(stdlib);

    // Initialize Python 
    Py_Initialize();

Внутри Python cmd строка keras для импорта занимает некоторое время (3 секунды), но работает (предупреждение, но я не нашел никакого вреда в этом):

>>> import keras
I:\LIBs\cpython354\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
Using TensorFlow backend.
>>>

Сейчас я в растерянности, я не знаю, где искать, так как нет трассировки стека.

1 ответ

Решение

Похоже, что когда вы импортируете keras, он выполняет следующую строку:

sys.stderr.write('Using TensorFlow backend.\n')

или sys.stderr не был определен в Python, встроенном в Windows

Простым исправлением является определение sys.stderr, например:

import sys
class CatchOutErr:
    def __init__(self):
        self.value = ''
    def write(self, txt):
       self.value += txt

catchOutErr = CatchOutErr()
sys.stderr = catchOutErr
Другие вопросы по тегам