2016-11-23 60 views
0

我使用Anaconda,我已經使用環境安裝了sqlite3。當從C++調用Python腳本時,SQLite3被忽略,沒有錯誤

當我在IDE中運行我的腳本時,它創建並填充數據庫沒有問題。

當我從C++運行腳本時,它忽略了SQLite3部件,並且沒有發生錯誤,也沒有創建或填充數據庫。我知道該腳本在從C++調用時會運行,因爲它的其他部分仍然可以正常工作,但它只是忽略了SQLite方面。

C++部分:

string command = "C:\\Anaconda3\\python.exe C:\\CoSim2\\PYTHON\\python\\MainMaster.py " + std::to_string(minute); 

的Python部分:

import math 
import sys 
import sqlite3 
from pathlib import Path 


conn = sqlite3.connect('CoSimTest.db') 
c = conn.cursor() 

def create_table(): 
    c.execute('CREATE TABLE IF NOT EXISTS PowerSysInfo(time REAL, NumOfNodes INT, NumOfBuses INT, BusLocation TEXT, PhaseNumber INT, v1 REAL, a1 REAL, phase1 INT, v2 REAL, a2 REAL, phase2 INT, v3 REAL, a3 REAL, phase3 INT)') 

create_table() 

這是怎麼回事?爲什麼在IDE中運行腳本完美工作,但是當C++運行.py時,它只是忽略了SQLite部件而沒有錯誤?

+0

我應該添加在調試器中:sqlite3._version_將給出:*** AttributeError:模塊'sqlite3'沒有屬性'_version_' – WBig

+0

什麼是當前目錄? –

+0

在spyder? cwd = os.getcwd()。我的工作路徑目錄是C:\\ CoSim2 \\ PYTHON \\ python \\。你是這個意思嗎?在運行C++的OMNeT ++中,「工作空間」是C:\\ CoSim2,所以它應該都很好? – WBig

回答

0

所以我想我會解決我的問題,以防其他人有這個問題。 conn = sqlite3.connect('CoSimTest.db')需要一個完整的路徑,因爲本地目錄在不從ide運行時會發生變化。

0

從你提供的實際啓動python腳本的方式不可能知道。你有一個字符串可以複製你在命令行中輸入的內容(我認爲這就是std::to_string(minute)的一部分?),但是根據你實際執行腳本的方式,它可能希望啓動參數的輸入方式不同。

檢查以確保您的參數實際上正在被python腳本看到。

確保您的工作目錄與IDE使用的目錄相同。

+0

參數只是在程序中傳遞時間(OMNeT ++ 4.3)。隨後在python腳本中使用它來模擬其他事情並填充數據庫。但是,例如,即使我在IDE中運行腳本後留下requiredtime = float(sys.argv [1]),它仍會在給出錯誤消息之前創建數據庫,表明沒有輸入參數。所以我不認爲這與爭論有什麼關係? – WBig

+0

更清晰的是,我正在將它們記錄在txt文件中,這些參數正在被看到。這就是我知道腳本是如何工作並被調用的,但SQLITE方面正在被忽略。它甚至不會像在IDE中使用腳本一樣創建DB – WBig

+0

您是否使用IDE使用的相同工作目錄? – Software2