2014-11-20 25 views
6

Tôi đang tạo một ứng dụng Qt Quick GUI (cho các cửa sổ), sử dụng OpenGL và C++ cho một số công cụ tính toán chuyên sâu. Tôi muốn nhúng mã python vào ứng dụng, để làm một số công cụ tương đối dễ dàng hơn trong python. Về cơ bản, tôi chỉ muốn mã C++ gọi hàm trong kịch bản lệnh python và để cho tập lệnh thực hiện công việc, sau đó lưu trữ dữ liệu được trả về trong một biến (chuỗi, hoặc phao vv) để sử dụng tiếp. Tôi đang sử dụng Qt creator, và tôi đã nhận được python3 lib cho trình biên dịch MinGW. Tôi đã thử một số mã, nhưng có vẻ như python lib không hoàn toàn tương thích với người tạo Qt. IS sử dụng pyqt cho điều này sẽ là một ý tưởng tốt? Điều gì sẽ là cách tốt nhất và dễ nhất để làm điều này?Nhúng python 3.4 vào ứng dụng C++ Qt?

EDIT: Đây là mã cơ bản tôi đã thử, trước tiên nó đã cho tôi một lỗi nói, không thể tìm thấy pyconfig.h. Sau đó, tôi thêm một INCUDEPATH để python34 của tôi bao gồm thư mục.

#include "mainwindow.h" 
#include <QApplication> 
#include <boost/python.hpp> 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    using namespace boost::python; 

    PyObject *pName, *pModule, *pDict, *pFunc, *pValue; 

     Py_Initialize(); 

     pName = PyString_FromString(argv[1]); 

     pModule = PyImport_Import(pName); 


     pDict = PyModule_GetDict(pModule); 


     pFunc = PyDict_GetItemString(pDict, argv[2]); 

     if (PyCallable_Check(pFunc)) 
     { 
      PyObject_CallObject(pFunc, NULL); 
     } else 
     { 
      PyErr_Print(); 
     } 

     // Clean up 
     Py_DECREF(pModule); 
     Py_DECREF(pName); 

     Py_Finalize(); 

    return a.exec(); 
} 

tập tin .pro của tôi:

QT  += core gui 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = TestWidgetApp 
TEMPLATE = app 

INCLUDEPATH += C:/boost_1_57_0 
INCLUDEPATH += C:/Python34/include 

SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

FORMS += mainwindow.ui 

OTHER_FILES += 

Sau đó, các lỗi sau đây:

C: \ Python34 \ include \ object.h: 435: lỗi: C2059: lỗi cú pháp: '; '

C: \ Python34 \ include \ object.h: 435: lỗi: C2238: mã thông báo không mong muốn trước ';'

C: \ Users \ Amol \ Desktop \ TestWidgetApp \ main.cpp: 19: lỗi: C3861: 'PyString_FromString': nhận dạng không tìm thấy

+1

Bạn có thể hiển thị mã bạn đã thử và giải thích lý do mã không hoạt động không? – user3419537

+1

Theo tôi, sẽ dễ dàng hơn nhiều khi xây dựng ứng dụng trong PyQt + PyOpenGL và nếu cần thiết, hãy tính toán trong mô-đun C++. PyQt và PyOpenGL là các trình bao bọc xung quanh mã C++, vì vậy nó không làm chậm. Và nếu tính toán của bạn sử dụng các thường trình thông thường (ví dụ: phép tính xấp xỉ tuyến tính, phép nhân ma trận, vv), cũng có các thư viện Python được viết bằng C++, bạn có thể bỏ qua toàn bộ phần C++. – Fenikso

+3

RTFM [Nhúng Python vào một ứng dụng khác] (https://docs.python.org/3/extending/embedding.html) –

Trả lời

0

Tôi đã gỡ bỏ tất cả các mã Qt từ ví dụ của bạn và sau đó tôi đã cố gắng để biên dịch nó (Qt không có gì để làm với lỗi biên dịch của bạn). Và nó biên dịch cho tôi. Sự khác biệt là tôi đã sử dụng các tệp bao gồm từ Python 2.7.

Vì vậy, tôi đã làm một tìm kiếm chút cho chuỗi PyString_FromString trong các thư mục: C:\Python33\includes (Tôi lưu ý bạn sử dụng python 3.4 và không 3.3 nhưng tôi nghi ngờ điều này là một điều 3.x) và C:\Python27\includes.

Kết quả:

Python 3,3

Searching string PyString_FromString in Python33's include folder

Python 2,7

Searching string PyString_FromString in Python27's include folder

Vì vậy, rõ ràng, Python 3.4 không được hỗ trợ bởi Boos của bạn phiên bản tPython.

0

Python3 không có chức năng PyString_FromString. Python3 str loại nội bộ là các đối tượng unicode với cấu trúc phức tạp.

Sử dụng PyUnicode_FromString hoặc PyUnicode_FromStringAndSize cho xây dựng str đối tượng từ UTF-8 mã hóa C string (char*).

+0

Nó vẫn cho tôi hai lỗi này: 'C: \ Python34 \ include \ object.h: 435: lỗi: C2059: lỗi cú pháp: ' ; '' ' C: \ Python34 \ include \ object.h: 435: lỗi: C2238: mã thông báo không mong muốn trước'; '' –

+0

Bạn có chắc chắn rằng bạn sử dụng đúng phiên bản python trong bộ công cụ biên dịch không? Giống như 'bjam target-os = windows/python = 3.4'? Hoặc ít nhất là xác định 'PY_MAJOR_VERSION = 3' và' PY_MINOR_VERSION = 4'. –

2

Vấn đề ở đây là Python 3.4 có cấu trúc được gọi là "vị trí", (đối tượng tệp.h, trong typedef cho PyType_Spec), mà Qt định nghĩa ra từ dưới bạn để bạn có thể nói những câu như:

public slots: 

trong mã của bạn. Giải pháp là để thêm:

#undef slots 

ngay trước khi bạn bao gồm Python.h, và để xác định lại nó trước khi bạn có bất cứ điều gì mà sử dụng "khe" theo cách mà Qt làm:

#undef slots 
#include <Python.h> 
#define slots 

#include "myinclude.h" 
#include <QString> 

Một chút của một hack (bởi vì bạn đang phụ thuộc vào một định nghĩa cụ thể của slots trong Qt), nhưng nó sẽ giúp bạn đi.

-1

Di chuyển của bạn

#include "boost/python.hpp" 

... là trước kia của bạn bao gồm và nó sẽ giải quyết vấn đề của bạn.

Vấn đề thực tế là Scott Deerwester được mô tả trong câu trả lời của anh ấy.

Các vấn đề liên quan