从C++;项目(Visual Studio) 在Windows平台下,我需要调用C++中的Python(3.6)函数实现的流水线。来自文件“实验测试.py”的函数“函数名”将文本字符串作为输入参数,并返回另一个文本字符串作为结果。我尝试了下面的代码,但无法正常工作–库shutil、编解码器、makedirs等中的python函数无法工作

从C++;项目(Visual Studio) 在Windows平台下,我需要调用C++中的Python(3.6)函数实现的流水线。来自文件“实验测试.py”的函数“函数名”将文本字符串作为输入参数,并返回另一个文本字符串作为结果。我尝试了下面的代码,但无法正常工作–库shutil、编解码器、makedirs等中的python函数无法工作,python,c++,Python,C++,C++代码(简化): Python代码(简化): 因此Python不会生成新文件。我试图通过调用 pyRun-SimuleStand(“导入SUTUL”)来导入C++中的Python模块;Py_Initialize()之后的strong>etc但这没有帮助 我做错了什么?我尝试用给定的intel复制问题,但这是不可能的,所以我创建了一个小示例(尽可能接近问题中描述的内容)-也称为(顺便说一句,问题中应包括该示例) 所以,我在这里说明的问题是: C++ 加载Python引擎 加载Python模

C++代码(简化):

Python代码(简化):

因此Python不会生成新文件。我试图通过调用<强> pyRun-SimuleStand(“导入SUTUL”)来导入C++中的Python模块;Py_Initialize()之后的strong>etc但这没有帮助


我做错了什么?

我尝试用给定的intel复制问题,但这是不可能的,所以我创建了一个小示例(尽可能接近问题中描述的内容)-也称为(顺便说一句,问题中应包括该示例)

所以,我在这里说明的问题是:

  • C++
    • 加载Python引擎
    • 加载Python模块
    • 从该模块加载一个函数,该函数:
      • 接收表示文件名的(字符串)参数
      • 读取文件内容(文本)并将其返回
      • 如果出现错误,只需返回文件名即可
    • 调用该函数
    • 获取函数调用结果
我正在使用(在Win 10 x64(10.0.16299.125)上):

  • Python3.5.4x64
  • VStudio 2015社区版
该结构包括:

  • VStudio项目/解决方案
    • 源文件(main00.cpp(从main.cpp重命名了它,但不想重新做所有截图(包含它))
  • Python模块(实验\测试.py)
  • 测试文件(Test_file.txt)
main00.cpp:

#包括
#包括
#如果已定义(_调试)
#未定义调试
#定义_调试_未定义
#恩迪夫
#包括
#如果已定义(\u调试\u未定义)
#定义调试
#未定义调试未定义
#恩迪夫
#定义模块名称“实验测试”
#定义函数名“函数名”
#定义测试文件名“TEST\u dir\\TEST\u FILE.txt”
使用std::cout;
使用std::cin;
使用std::endl;
使用std::string;
int清理(常量字符串&text=string(),int exitCode=1){
Py_Finalize();
如果(!text.empty())

CUT什么是不正确的(错误,回溯等)?你是否尝试直接运行Python模块(不添加C++层)?注意你的代码语法上不正确(缩进)。从C++调用Python模块,它正确运行,没有错误发生。C++接收到与输入相等的结果。Python函数应该将输入字符串写入文本文件,处理该文件,然后读取结果并返回它。代码中的缩进是正确的,不幸的是,我在出错时出错了。我在这里写的,谢谢。谢谢你这么详细的回答!我正试图在我的代码中使用它,但是python模块今天无法加载。我想,如果我找不到错误,我会尝试在我的机器上使用你的代码。你有机会测试吗(不仅仅是代码,还有构建过程)?如果您在执行Python代码时仍然存在问题,请将实验_test.py中的所有代码包装在
try/except
子句中,并打印异常。很抱歉让您久等了-我的代码当时不起作用。由于构建过程的差异,现在非常有趣。今天我开始重建您的解决方案(使用我的软件版本)-但是如果我在其他依赖项中写入“$(PythonDir)\libs”,我会得到链接错误。当时我用“$(PythonDir)\libs\python36.lib”停止,稍后会继续。我会写下结果。但是您在用户宏下设置$(PythonDir)以获得指向正确路径的正确体系结构,对吗?
std::string Text,Result;
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
Py_Initialize();

pName = PyUnicode_FromString("experiment_test");
pModule = PyImport_Import(pName);    
pDict = PyModule_GetDict(pModule);

pFunc = PyDict_GetItemString(pDict, "function_name");

pArgs = PyTuple_New(1);
pValue = PyUnicode_FromString(Text.c_str());
PyTuple_SetItem(pArgs, 0, pValue);

if (PyCallable_Check(pFunc))
{
    pValue = PyObject_CallObject(pFunc, pArgs);
    if (pValue != NULL)
    {
        Result = PyUnicode_AsUTF8(pValue);    
        Py_DECREF(pValue);
    }
    else return false;    
}
// ...

Py_Finalize();
#!/usr/local/bin/python3
import shutil
import codecs
from os import makedirs
from os import path
from os import unlink
from subprocess import call

def function_name():

    name = 'working_files/current_text'

    if not path.exists('working_files'):
        makedirs('working_files')
    if path.exists('result.txt'):
        unlink('result.txt')
    with codecs.open(name + '.txt', 'w', encoding='utf-8') as f:
        f.write(text)
    # ...
    return result
line 0 - dummy
line 1 - gainarie