Я использую pybind11 (2.4.2) в моем приложении c ++ для встроенной работы графического интерфейса. Однако импорт PyQt5, в частности, не выполняется.
При запуске сценария с использованием консоли с python script.py
все работает нормально. Запуск из c ++ Python API (pybind11) не работает, выводит сообщение об ошибке NameError: name 'QtWidgets' is not defined
, хотя словарь импорта ясно показывает, что QtWidgets
есть: [..., 'PyQt5.QtGui', 'PyQt5.QtWidgets', 'PyQt5.uic', ...]
from PyQt5 import QtWidgets, uic
from PyQt5.QtCore import QTimer
import numpy as np
import pyqtgraph as pg
import functools
Только запускscript.py
без явного ключевого слова python
в консоли выводит ту же ошибку. Я проверил Windows PATH
, и у меня там только одна версия Python. Серверная часть c ++ создается вместе с Visual Studio вместе с pybind11.
Я подозреваю, что это как-то связано со средой, которую я использую, но я не могу понять это.
РЕДАКТИРОВАТЬ:
Это код, который я пытался запустить, который поднял NameError: name 'QtWidgets' is not defined
, запускается из Visual Studio с pybind11 (v2.4.2):
from PyQt5 import QtWidgets, uic
from PyQt5.QtCore import QTimer
import numpy as np
import pyqtgraph as pg
import functools
sys.stderr.write('Python version: {}\n' .format(platform.python_version())) # 3.7.5
sys.stderr.write('Arch: {}\n' .format(struct.calcsize("P") * 8)) # 32
sys.stderr.write('Executable location: {}\n' .format(sys.executable)) # Exe location
sys.stderr.write('System path: {}\n' .format(sys.path))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
#Load the UI Page
uic.loadUi('mainwindow.ui', self)
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
self.button_start.clicked.connect(self.onClick)
self.setup()
self.plot(x, y)
(...)
def main():
app = QtWidgets.QApplication(sys.argv)
main = MainWindow() # Error here -> NameError: name 'QtWidgets' is not defined
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()