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
3.  安装  qt-vs-tools-msvc2013-2.0.0.vsix
下载地址: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添加进去,唔要放前面一点。



暂时想到这么多,有问题再补上~~~~~~~~~~

你可能感兴趣的:(C++编程)