Python C API: ошибка импорта при использовании C API - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над интеграцией 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 сообщить об устранении неполадок?

...