在C+;中使用嵌入式python运行文件时创建类实例+;

在C+;中使用嵌入式python运行文件时创建类实例+;,python,c++,Python,C++,我试图在从嵌入式python调用脚本时创建python类的实例- Py_Initialize(); object main_module = import("__main__"); object main_namespace = main_module.attr("__dict__"); std::string fileName = "D:/Dog.py"; const char *f = fileName.c_str(); PyObject *obj = Py_BuildValue("s

我试图在从嵌入式python调用脚本时创建python类的实例-

Py_Initialize();

object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");

std::string fileName = "D:/Dog.py";
const char *f = fileName.c_str();

PyObject *obj = Py_BuildValue("s", "D:/dog.py");
FILE *file = _Py_fopen(f, "r+");    

if (file != NULL)
{    
   PyObject* result = PyRun_File(file, f, Py_file_input, main_namespace.ptr(), main_namespace.ptr());
}
我的Dog.py文件如下所示-

import sys
import os
import Cat

class Dog:
   def __init__(self):
        print("I am a dog!")
        self.cat = Cat()

def main():
    """ main function """
    print("\nStart...")
    dog = Dog()

    return 0

#### --Main-- ####
if __name__ == "__main__":
    main()
我的Cat.py文件如下所示-

import sys
import os

class Cat:
   def __init__(self):
        print("I am a cat!")

def main():
    """ main function """
    print("\nStart...")
    cat = Cat()

    return 0

#### --Main-- ####
if __name__ == "__main__":
    main()

这段代码因一些python错误而崩溃。如果Dog类没有实例化Cat,那么代码将成功执行。我应该怎么做才能在没有任何错误的情况下实例化Cat类?

您可以导入一个python文件并使用以下代码调用一个方法:

#include <Python.h>

int main() {
    Py_SetProgramName(L"main");
    // Py_SetPythonHome(L"");
    // Py_SetPath(L"");

    // Py_IgnoreEnvironmentFlag = 1;
    // Py_DontWriteBytecodeFlag = 1;
    // Py_NoUserSiteDirectory = 1;
    Py_IsolatedFlag = 1;
    // Py_NoSiteFlag = 1;

    Py_Initialize();

    PyObject * dog_module = PyImport_ImportModule("Dog");
    PyObject * dog = PyObject_CallMethod(dog_module, "Dog", NULL);
}
#包括
int main(){
Py_SetProgramName(L“主”);
//Py_SetPythonHome(左“);
//Py_设置路径(L“);
//Py_IgnoreEnvironmentFlag=1;
//Py_DontWriteBytecodeFlag=1;
//Py_NoUserSiteDirectory=1;
Py_隔离滞后=1;
//Py_NoSiteFlag=1;
Py_初始化();
PyObject*dog_模块=PyImport_ImportModule(“dog”);
PyObject*dog=PyObject\u调用方法(dog\u模块,“dog”,NULL);
}
如果需要,使用
Py_SetPythonHome
Py_SetPath
。 取消对嵌入式环境中可能需要的标志的注释

  • 文件
  • 文件
  • 和的文档

Dog.py
中,不导入
Cat.py
Dog
类如何知道在哪里可以找到
Cat
类?(撇开为什么狗首先要实例化猫的问题不谈…@Seb抱歉,忘了添加它,但问题仍然存在there@Scheff定位Cat.py不是问题,因为如果我注释行“self.Cat=Cat()”,代码工作正常。我还将D:\添加到系统路径中,例如-std::ostringstream path;你的意思是:<代码>从CAT导入CAT//CODE?也许是个愚蠢的问题,但是当你从Python(例如,代码> Python Fo.Py <代码>)执行它时,脚本是否成功运行,而不是通过C++运行它?