2

このVisualC++コードとPythonが埋め込まれていますが、以下のコードを使用して外部Pythonコードを実行しようとすると、デバッグモードでエラーが発生します。

Unhandled exception at 0x77cf15de in CMLAir.exe (my code): 
access violation writing location 0x00000014.

PyRun_File関数がc++コードを介して呼び出されると、エラーが発生します。
C++関数は次のとおりです。

  void CRailtestDoc::OnPreprocessorRunscript()
  {

  #ifdef USE_PYTHON

//for now, pull up Open dialog for user to specify script
CString strPythonScriptPath;
CString strTitle = "Run Python Script";
CFileDialog dlg(TRUE, ".py", NULL);
dlg.m_ofn.Flags |= OFN_PATHMUSTEXIST;
dlg.m_ofn.lpstrTitle = (LPCTSTR)strTitle;
if (dlg.DoModal() == IDOK)
{
    strPythonScriptPath = dlg.GetFileName( );
}
else
{
    return;
}

FILE* fp;
fp = fopen((LPCSTR)strPythonScriptPath, "r+");
if (fp == NULL)
{
    CString strErrMsg;
    strErrMsg.Format("troble opening python file: %s", (LPCSTR)strPythonScriptPath);
    AfxMessageBox(strErrMsg);
    return;
}

//
// TODO: we need to make sure that we don't call Py_Initialize more than once
// see Python/C API Reference Manual section 1.4
//
m_bRunningScript = TRUE;
Py_Initialize();

PycString_IMPORT; //Macro for importing cStringIO objects

//start up our own modules?  Is this needed here?
initcml();
initresults();

PyObject* localDict;
PyObject* mainModule;
PyObject* mainModuleDict;
mainModule = PyImport_AddModule("__main__");
//mainModule = PyImport_AddModule("__builtins__");

if(mainModule==NULL)
{
    AfxMessageBox("Problems running script");
    m_bRunningScript = FALSE;
    return;
}
mainModuleDict = PyModule_GetDict(mainModule);
localDict = PyDict_New();

//Now run the selected script
PyObject* tempPyResult = 
PyRun_File(fp, strPythonScriptPath, Py_file_input, mainModuleDict, mainModuleDict); 
//<=== where the code exit with unhandled  exception at 0x77cf15de
UNREFERENCED_PARAMETER(tempPyResult);

// See if an exception was raised and not handled.
// If so, return traceback to user as MsgBox

}

これが私がC++コードから実行しようとしている外部Pythonスクリプトです:

  import cml, results 

  def main():
  baseCase = "C:\\Program Files\\CMLAir32\\Examples\\Quick4_Example.cml" 
  outFile = "c:\\output.txt"
  f = open(outFile, "w") 

  #open our .cml case
  if cml.OpenCase(baseCase) == 0:
    return 

  #set initial mesh size 
  meshSize = 177
  cml.SetGridSizeX(meshSize)
  cml.SetGridSizeY(meshSize)
  cml.SaveCaseNoWarn()
  while meshSize < 400:
    #run it 
    cml.RunCaseNoWarn()
    #get results
    res = results.Results()
    res.GetResults() 
    if res.HasResults() == 0: 
        cml.MsgBox("error getting results, aborting") 
        return 
    #pull out minimum fly height 
    singleResult = res[0]
    fh = singleResult.minFH
    #output current mesh size and minimum fly height 
    dataStr = str(meshSize) + ' ' + str(fh)
    f.write(dataStr) 
    #increment mesh size 
    meshSize += 16
    cml.SetGridSizeX(meshSize) 
    cml.SetGridSizeY(meshSize) 
    cml.SaveCaseNoWarn()

    main() 

PyRun_File関数でエラーが発生するのはなぜですか?

PythonをC++コードに埋め込むことについてはよくわからないので、ここにいくつかのポインタをいただければ幸いです。私はPythonに比較的慣れていないことを覚えておいてください。私のプログラミング経験のほとんどはVisualC++です。この状況で2つを組み合わせるための最良の方法は何でしょうか?

4

1 に答える 1

2

fpエラーは、C++ と の python バージョンの間の誤解または混乱が原因でしfpfp

PyObject* PyFileObject; PyFileObject = PyFile_FromString(strPythonScriptPath, "r");

そしてそれは完璧に機能しました!

于 2012-06-21T23:43:21.320 に答える