c++調用python腳本遇到的那些坑

問題一:一開始我是在qt上編寫程序的,qt是32bit,但Python是64bit,在*.pro文件中配置了:

INCLUDEPATH += C:/Python27/include/
LIBS += C:/Python27/libs/python27_d.lib
還是報錯,究極原因是bit位數一定要匹配,因此要下載64bit的qt,但自帶編譯器的qt MinW版找了好久沒看到64bit,官網上說要自己編譯(吐血)。

解決辦法:找到了64bit的qt 5.7.1 MSVC2013版,也就是依賴vs2013編譯器的qt版本:

1、安裝qt-opensource-windows-x86-msvc2013_64-5.4.0.exe
2、安裝qt-vs-addin-1.2.5-opensource.exe
下載地址:http://download.qt.io/official_releases/vsaddin/(qt msvc2013我是在bty上下載的),一般的安裝流程:http://liucanwei509.blog.163.com/blog/static/17126113201506114421653/
配置成功後在qt creator上進行編程,當然vs上也是沒毛病。

問題二:運行時報錯:未找到python27_d.lib

解決方法:網上一大堆,有自己編譯的dll的,有亂七八糟的,最最管用的就是:http://blog.csdn.net/sunboyiris/article/details/23736355,在python.h裏第六行加入:#define Py_NO_ENABLE_SHARED  


問題三:我的python腳本中import了第三方庫(比如我import numpy),運行時報錯,如果沒有import第三方庫則正常

解決方法:一開始我是使用anaconda來直接安裝python,但有個缺點就是第三庫不能很好的導入到工作目錄下(小白不懂),就像之前一直用IDE spyder來對python進行編程時一樣,一個文件夾下的moduls不會自動加載進來,而用pycharm則會自動加載。因此我把anaconda卸載了,安裝了一個最原始的python2.7.9(這個自帶pip,不然自己安裝pip又要吐兩斤血),然後在pip install numpy ,當然安裝時環境變量path裏已經包含了 c:\python27 和c:\python27\scripts,沒有自己加進去。這只是開始,接下來看代碼:

  QApplication a(argc, argv);
    MainWindow w;
    w.show();
    Py_Initialize();
    PyObject * pModule = NULL;
    PyObject * pFunc = NULL;
    pModule =PyImport_ImportModule("test_my");      //Test001:Python文件名
    pFunc= PyObject_GetAttrString(pModule, "add");  //Add:Python文件中的函數名
    PyObject *pArgs = PyTuple_New(2);               //函數調用的參數傳遞均是以元組的形式打包的,2表示參數個數
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序號  i表示創建int型變量
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序號
    PyObject *pReturn = NULL;
    pReturn = PyEval_CallObject(pFunc, pArgs);      //調用函數
    int result;
    PyArg_Parse(pReturn, "i", &result);    //i表示轉換成int型變量
    cout << "5+7 = " << result << endl;
    Py_Finalize();
    return a.exec();


下面是python的源碼:

import numpy as np
def HelloWorld():  
    print "Hello World"  
def add(a, b):
    tmp=np.random.randint(10,88)
    print 'tmp',tmp
    return a+b*tmp  
def TestDict(dict):  
    print dict  
    dict["Age"] = 17  
    return dict  
class Person:  
    def greet(self, greetStr):  
        print greetStr  
#print add(5,7)  
#a = raw_input("Enter To Continue...") 

非常重要的一點,首先你要在python IDE GUI上完美運行自己的python腳本,不然會崩潰,而不是在pycharm或者spyder中能運行,但在python shell上運行不了!!!!


問題四:如何把qt工程轉爲vs2013項目

解決方法:網上說用eit?忘記了是qt文件夾tool裏的一個exe,之前試過一次,沒成功,最簡單的辦法就是在*.pro目錄下生成一個*.bat批量運行腳本:


::該腳本的功能是將當前文件夾下及其子文件夾下的qt pro文件轉換爲vs vcxproj文件,
::並將所生成的vcxproj文件中qt的絕對路徑替換成QTDIR環境變量
@echo off
if "%QTDIR%"=="" (
    @echo "QTDIR" environment variable is not configured
    pause
    exit
)
set bootDir=%cd%
set tagName=temp
set tagSubEx=bat
set file=%tagName%.%tagSubEx%
@echo %cd%
for /r %%i in (*.pro) DO (
    @echo %%i
    call :create %%i
)
pause
cd %bootDir%
set delFile=del.bat
rem set /a flag=0
echo @echo off>%delFile%
rem echo set flag=^0>>%delFile%
echo for /r %%%%j in (*%file%) DO (>>%delFile%
echo call :delete %%%%j>>%delFile%
echo )>>%delFile%
rem echo set /a flag+=^1>>%delFile%
echo :delete>>%delFile%
echo del %%1>>%delFile%
call %delFile%
cd %bootDir%
del %delFile%
exit
:wait
if %flag% equ 1 (
@echo flag=%flag%
pause
del %delFile%
exit
) else (
@echo this is working
pause
goto wait
)
:create
cd %~dp1
echo @echo off>%file%
echo set expQTDIR=%%QTDIR%%>>%file%
echo %%QTDIR%%\bin\qmake -tp vc>>%file%
echo set tagEx=vcxproj>>%file%
echo for /r %%%%j in (*.vcxproj) DO (>>%file%
echo call :replace %%%%j>>%file%
echo )>>%file%
echo :replace>>%file%
echo setlocal Enabledelayedexpansion>>%file%
echo ren %%1 a.%%tagEx%%>>%file%
echo for /f "tokens=*" %%%%s in (a.%%tagEx%%) do (>>%file%
echo set var=%%%%s>>%file%
echo set var=!var:%%expQTDIR%%=%%%%QTDIR%%%%!>>%file%
echo echo !var!^>^>b.%%tagEx%%>>%file%
echo )>>%file%
echo del %%~nx1>>%file%
echo ren b.%%tagEx%% %%~nx1>>%file%
echo del a.%%tagEx%%>>%file%
echo endlocal>>%file%
echo exit>>%file%
start %file%
:continue

運行成功後會生成vcxproj文件,當然打開後一大堆報紅,你需要在工程--屬性--vc++下添加  C:\Qt\Qt5.7.1\5.7\msvc2013_64這個的include和lib。 嗯還有一點就是會報錯說無法打開ui_mainwindow.h這個文件,這個文件需要你在qt編輯環境下對項目執行qmake,就會在debug文件夾下生成,然後在vs2013中把原先那個刪掉加載新的進去就ok了



問題五:有些專業的python包通過普通的pip無法安裝或者是安裝後各種error,該如何是好?~~~

解決方案:還是重新迴歸Anaconda吧,自己手裝package太痛苦了,不信的話大家可以試試安裝theano並實現g++加速。首先把電腦上的python、anaconda文件和程序全部卸載刪除乾淨,環境變量也清理。然後安裝64bit的anaconda,安裝必須在C盤默認安裝位置,並且在安裝時有兩個打鉤的地方,注意第二個,說的是允許其他軟件調用anaconda的庫,這裏是要打鉤的,安裝完成後,用conda安裝theano  conda install theano  然後再conda install mingw libpython,這樣省去很多不必要的麻煩,親測成功。接着安裝64bit的python,安裝在默認地址就可以,然後把安裝好在C盤的Python27文件刪除,把anaconda文件改名爲Pythn27。一切大功告成,別問我爲什麼,大家自己看看環境變量path裏的第一個是不是 C:Python27\和C:Python27\scipts就行了,不是自己加上。



另:由於調用串口類,要打開註冊表獲取串口信息,需要用到RegEnumValue這些亂七八糟的api,但qt經常編譯失敗link2019無法解析外部字符?,那隻能拿vs來編譯了。通過vs平臺編譯的xxx.exe運行時可能會提示丟失qt5weigthts.dll文件?並不是什麼網上說的那種亂七八糟的殺毒軟件給刪的,是因爲編譯時bin庫沒有指定好。

解決方法:在電腦環境變量path中,把C:\Qt\Qt5.7.1\5.7\msvc2013_64\bin添加進去,唔要放前面一點。



暫時想到這麼多,有問題再補上~~~~~~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章