Я работаю над интеграцией Python (через C API) с существующим приложением C ++. Все шло хорошо, пока я не наткнулся на странный случай, когда я получаю ошибку импорта при запуске фрагмента кода через C API. Когда я запускаю тот же фрагмент непосредственно в том же интерпретаторе, ошибки не возникает.
Я использую Window 10, Visual Studio 2010, Python 3.6.10, Qt 5.1.0
Вот что я делаю через C API:
Py_InitializeEx(0);
PyRun_SimpleString(QString(
"# allow us to retrieve stdout and stderr messages from C API\n"
"import sys\n"
"class OutputCatch:\n"
" def __init__(self):\n"
" self.data = ''\n"
" def write(self, msg):\n"
" self.data += msg\n"
"tdtOutCatcher = OutputCatch()\n"
"sys.stdout = tdtOutCatcher\n"
"tdtErrCatcher = OutputCatch()\n"
"sys.stderr = tdtErrCatcher\n"
"import zmq\n").toUtf8().data());
m_outCatcher = PyObject_GetAttrString(m_pyMain, "tdtOutCatcher");
m_errCatcher = PyObject_GetAttrString(m_pyMain, "tdtErrCatcher");
QString stdOut(std::move(getOutStr(m_outCatcher)));
QString stdErr(std::move(getOutStr(m_errCatcher)));
qDebug() << stdOut << stdErr;
Вывод, который я получаю из вышеприведенного:
Traceback (most recent call last):
File "<string>", line 12, in <module>
File "C:\Python36-32\lib\site-packages\zmq\__init__.py", line 47, in <module>
from zmq import backend
File "C:\Python36-32\lib\site-packages\zmq\backend\__init__.py", line 40, in <module>
reraise(*exc_info)
File "C:\Python36-32\lib\site-packages\zmq\utils\sixcerpt.py", line 34, in reraise
raise value
File "C:\Python36-32\lib\site-packages\zmq\backend\__init__.py", line 27, in <module>
_ns = select_backend(first)
File "C:\Python36-32\lib\site-packages\zmq\backend\select.py", line 28, in select_backend
mod = __import__(name, fromlist=public_api)
File "C:\Python36-32\lib\site-packages\zmq\backend\cython\__init__.py", line 6, in <module>
from . import (constants, error, message, context,
ImportError: cannot import name 'constants'
Когда я запускаю эквивалентный фрагмент кода в python:
# test.py
# allow us to retrieve stdout and stderr messages from C API
import sys
class OutputCatch:
def __init__(self):
self.data = ''
def write(self, msg):
self.data += msg
tdtOutCatcher = OutputCatch()
sys.stdout = tdtOutCatcher
tdtErrCatcher = OutputCatch()
sys.stderr = tdtErrCatcher
import zmq
print(zmq)
# Uncomment when running directly from Python (not through the C API)
print(sys.stderr.data, file=sys.__stderr__)
print(sys.stdout.data, file=sys.__stdout__)
Я получаю:
> C:\Python36-32\python.exe .\test.py
<module 'zmq' from 'C:\\Python36-32\\lib\\site-packages\\zmq\\__init__.py'>
Почему поведение будет другим? Как мне go сообщить об устранении неполадок?