我需要在Windows平台下从我的C项目中调用一个实现为Python(3.6)函数的管道。文件“experiment_test.py”中的函数“function_name”将文本字符串作为输入参数,并返回另一个文本字符串作为结果。我尝试了下面的代码,但它不能正常工作-来自库shutil,codecs,makedirs等的python函数不能工作。
C代码(精简版):
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();
Python代码(精简版):
#!/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
因此Python不会生成新文件。我尝试在C++中通过调用**PyRun_SimpleString(“import shutil”)导入Python模块;etc afterPy_Initialize();”””但它没有帮助。
我做错了什么?
1条答案
按热度按时间3pmvbmvn1#
我尝试用给定的intel复制问题,但这是不可能的,所以我创建了一个小例子(尽可能接近问题中描述的内容)-也称为[SO]: How to create a Minimal, Reproducible Example (reprex (mcve))(应该包含在问题中 * BTW *)
所以,我在这里说明的问题是:
我正在使用(在 * Win 10 x64(10.0.16299.125)* 上):
结构包括:
让 * VStudio * 知道 * Python * 包含文件的位置:
让 * VStudio * 知道 * Python * lib文件的位置(如果只需要 * pythonxx *. lib *(PYTHONCORE),则不需要任何额外的东西,因为 * Python * 代码默认包含 * PYTHONCORE *;否则,其余的都应该在[MS.Learn]: .Lib Files as Linker Input中指定:
虽然它很旧,但[SO]: What files are required for Py_Initialize to run? (@CristiFati's answer)可能包含一些有用的信息