1. 程式人生 > >c++呼叫python指令碼遇到的那些坑

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,沒有自己加進去。這只是開始,接下來看程式碼:

QApplicationa(argc,argv);
MainWindoww;
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);//呼叫函式
intresult;
PyArg_Parse(pReturn,"i",&result);//i表示轉換成int型變數
cout<<"5+7="<<result<<endl;
Py_Finalize();
returna.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呼叫python遇到的那些

首先得保證安裝完整python的元件 我的是debian系統 apt-get install python-dev 編譯c程式時候不能簡單的 gcc ***.c 因為會找不到相關的標頭檔案 需要gcc ***.c -Wall -I/usr/include/python2.

c++呼叫python指令碼遇到的那些

問題一:一開始我是在qt上編寫程式的,qt是32bit,但Python是64bit,在*.pro檔案中配置了: INCLUDEPATH+=C:/Python27/include/ LIBS+=C:/Python27/libs/python27_d.lib 還是報錯,究極原

c++ 呼叫Python指令碼或者動態庫——環境Ubuntu 16.04下用codeblocks

背景:因為使用的是python版本的程式,最終要整合到C++環境的架構中,也就是說架構是c++的,交付使用者為c++的介面,但是呼叫的是python的庫,因此需要學習在c++環境下呼叫python。因為對python不熟悉,可以說有點一抹黑,因此從簡到難逐步探索。首先在c++

vs2010中C++呼叫python指令碼並製作安裝包

一、 準備工作 1. 安裝visual studio 210。 2. 安裝python編譯環境,筆者版本為2.7.2。 3. 安裝py2exe,用於給編寫好的python打包。 二、編寫python指令碼程式 以下程式為筆者為學校的bbs寫的登陸指令碼LilyLogin.

win64下C++呼叫python指令碼

#include <iostream> #include <Python.h> using namespace std; int main() { // D:\Python27\include\pyconfig.h // 修改 https://blog.csdn.n

在VS2017中用C#呼叫python指令碼

情景是這樣的:在C#中呼叫python指令碼進行post請求,python指令碼中使用了requests包。 Python的開發環境我們有比較多的選擇,pycharm、sublime text等等。但是作為.net平臺的Python語言ironPython,可以和C#互動,

VS2015下C++呼叫Python指令碼

C++呼叫Python在一些特殊的場景下有一定的價值。比如,要呼叫一個REST服務,c++本身做HTTP Client會很煩,如果使用Python指令碼去呼叫服務,返回結果給c++端就可以繞開這個問題。因為最近在一個原型開發中遇到了這個問題,所以為了快速拿出東西來,我決定使

java呼叫python指令碼——

在python指令碼中使用sys.argv接收入參,""(java傳過來的空字串)竟然丟失被忽略了,也是神奇。 (注意:接收引數從sys.argv[1]開始,sys.argv[0]是python指令碼的路徑地址)

C#中呼叫python指令碼,並使用python第三方arcpy模組

前言 1、C#中呼叫python指令碼,一是通過ironpython直接執行python指令碼,二是通過呼叫Process類啟動電腦上的python.exe,執行python指令碼。 前者在使用第三方arcpy模組式,會提示錯誤:No Module Named arcpy,

C++ 多執行緒呼叫Python指令碼

由於Python直譯器有全域性解釋所GIL的原因,導致在同一時刻只能有一個執行緒擁有直譯器,所以在C++多執行緒呼叫python指令碼時,需要控制GIL,執行緒獲取GIL。 在主執行緒中初始化Python直譯器環境,程式碼如下: { Py_Initialize()

qt c++呼叫python的matplotlib指令碼

目的:qt呼叫python 的指令碼,實現繪製3d曲線的功能 1. 需安裝的軟體 (64位和32位機器上均可安裝如下的軟體)   2. 環境變數 Path變數中新增: 新增變數Pythonpath 值: D:\Python27;D:\Python27\Lib;D:\Py

[VS2013]C++中呼叫Python指令碼提示 error LNK2001: 無法解析的外部符號__imp_PyString_FromString等錯誤的解決方案

配置如下 VS2013專案: Win32 Console,Release X64  包含目錄   : C:\Python27\include 庫 目 錄     : C:\Python27\libs

【VS2013】C語言呼叫Python指令碼環境搭建、函式呼叫呼叫demo.py指令碼an

#include <stdio.h> #include <stdlib.h> #include <string.h>#include <Python.h>int main(int argc, char** argv){int arg0 = 30;int arg1

C#中呼叫Python中遇到的(No module named xxx)

例如Python的程式碼是這個樣子的。 # coding=<utf-8> # -*- coding: utf-8 *- import requests import urllib def ClearDirect():#直接刪除 print('sadsa') C

Python 中的那些總結——持續更新

多說 分享 earlier als lse image code while HA 1.三元表達式之坑 很顯然,Python把第一行的(10 + 4)看成了三元表達式的前部分,這個坑是看了《Python cookbook》(P5)中學到的,書中的代碼: 2.Py

C++呼叫Python 3.7.0

開發環境:Visual Studio 2015 + Python 3.7.0 一、在C++程式碼中寫Python指令碼 在C++中含有呼叫Python指令碼的API函式,在C++程式碼中嵌入Python指令碼程式碼,是通過PyRun_SimpleString()函式實現。它允許將Pyth

C語言read函式的那些

  今天在複習UNIX檔案系統,用到那個read函式,但是無意中卻掉到一個坑裡了,用了一個多小時才找到問題根源,這裡記錄一下。   問題是這樣的:我需要使用read和write函式把鍵盤輸入的資訊複製到輸出。所以我寫了如下程式: #include<stdio.h> #define MAX

[SQL Server玩轉Python] 一.安裝環境及T-SQL呼叫python指令碼

在開發專案過程中,更多的是通過Python訪問SQL Server資料庫介面,進行資料探勘的操作;而SQL Server2016版本之後,嵌入了強大的R、Python、Machine Learning等功能,尤其是Python程式碼置於儲存過程中,可以實現一些便捷資料分析功能。 本系

2018-11-25隨筆-今天談談C++嵌入Python指令碼中遇到的問題

由於現在很多底層協議用C/C++,然後機器學習或者深度學習等演算法模型使用基於Python的TensorFlow來實現。所以現在C++用來做框架,做軟體介面,然後呼叫Python的演算法指令碼來進行計算是很常見的需求。 我們的專案中也存在著這樣的需求。下面來記錄一下相應的實現方式。 背景:C++上用MFC

淺析 C++ 呼叫 Python 模組

淺析 C++ 呼叫 Python 模組 作為一種膠水語言,Python 能夠很容易地呼叫 C 、 C++ 等語言,也能夠通過其他語言呼叫 Python 的模組。 Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程式中呼叫 Python 模組。 具體的文件參考