gpt4 book ai didi

python - 如何在 Xcode 中将 Python 函数导入 C?

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:37 24 4
gpt4 key购买 nike

出于研究原因,我正在尝试将 C 和 Python 结合起来,但我的代码中遇到了问题。我使用了教程中的代码,但似乎获取 python 文件的代码不起作用。这是代码:

你好类.py

def sayHello(name):
return "Hello " + name + "!"

主程序
int main(int argc, const char * argv[]) {
char name[50];
printf("What's your name?\n");
fgets(name, 64, stdin);
char *answer = NULL;
PyObject *modname, *mod, *mdict, *func, *stringarg, *args, *rslt;
Py_Initialize();
PySys_SetPath(Py_GetPath());
modname = PyString_FromString("helloClass");
mod = PyImport_Import(modname);// Here mod = null because it can´t find it.
if (mod){
mdict = PyModule_GetDict(mod);
func = PyDict_GetItemString(mdict, "sayHello");
if (func){
if (PyCallable_Check(func)) {
stringarg = PyString_FromString(name);
args = PyTuple_New(1);
PyTuple_SetItem(args, 0, stringarg);
rslt = PyObject_CallObject(func, args);
if (rslt) {
answer = PyString_AsString(rslt);
Py_XDECREF(rslt);
}
Py_XDECREF(stringarg);
Py_XDECREF(args);
}
Py_XDECREF(mdict);
Py_XDECREF(func);
}
Py_XDECREF(modname);
Py_XDECREF(mod);
}
printf("%s", answer);
answer = NULL; }

最佳答案

这里没有足够的信息给你完整的答案,但基本问题几乎可以肯定是 helloClass.py不会在模块搜索路径的任何地方结束,所以 PyImport_Import找不到。

例如,也许您正在构建您的 main可执行到类似 ~/Library/Developer/Xcode/DerivedData/Hello/Build/Products/Release/hello 的位置,但不复制 helloClass.py那里。或者,也许您正在那里复制它,但相当于 dirname $0不在您的模块路径上。或者……嗯,有一百万种可能性,但在每种情况下答案都是一样的:

  • 找出可执行文件和 Python 文件的安装位置。
  • 从这些知识中建立一条适当的(可能是相对的)路径。
  • 确保该路径被添加到模块路径中。

  • Python 搜索模块的具体细节在不同版本之间有所不同,但基本思想在 The import statement 中进行了解释。 (或 the 3.3 version ,它遵从 The import system ),而且通常只需在 sys.path 中添加一些内容即可.

    (请注意,如果您正在构建 .app 包而不仅仅是 Unix 命令行可执行文件,则有一个标准答案——您将 .py 文件放在标准位置,使用 Cocoa 或 CoreFoundation API 获取路径,并且然后使用它。但这似乎与这里无关。)

    查看您在 https://github.com/Eduardof0nt/help.git 上传的项目:

    你不是在抄袭 helloClass.py任何地方。您必须决定要将它复制到哪里,这完全取决于您要如何部署事物。但出于调试目的,只是为了得到一些可测试的东西,你可以把它放在 Hello Python! 旁边。可执行文件(在 build/Debugbuild/Release 中)。要做到这一点:
  • 在项目导航器中选择项目。
  • 在出现的项目 View 的左侧栏中选择目标。
  • 选择构建阶段选项卡。
  • 单击添加构建阶段按钮。
  • 添加复制文件阶段。
  • 将其目标设置为产品目录。
  • helloClass.py从项目导航器进入构建阶段。

  • 现在,当您构建时,如果您查看输出(打开“All”和“All Messages”),您将在“Link build/Debug/Hello Python”之后看到“Copy build/Debug/helloClass.py” !”。而且,如果您查看该目录内部,您会并排看到这两个文件。

    但这并不能解决您的全部问题。因为 /wherever/you/started/build/Debug不会出现在 sys.path 上Python 使用的。解决此问题的最快方法是调用 Py_SetProgramName(argv[0])就在 Py_Initialize() 之前, 和 PySys_SetArgvEx(argc, argv, 1)之后。对于您的用例,这可能不是正确的做法,但您将阅读文档并了解所有这些内容,因为我无法解释在 SO 中嵌入 Python 的所有细节回答。

    当您尝试学习这些东西时,您可能想要进行一些调试。例如,您可以 printf(path=%s\n", Py_GetPath())看看 sys.path等价于和 PyObject_Print(mod, stdout, 0)查看 mod 中的内容, 等等。但实际上,您会想要使用 Xcode 调试器——添加断点并尝试在运行时执行此操作。

    Extending and Emnbedding the Python Interpreter 中解释了其中的大部分内容。 ,而您确实需要阅读;没有替代品。 (您不需要阅读整个 Python/C API Reference Manual ,但在完成之前,您最终会阅读大量内容,并擅长搜索它。)但是,因为嵌入 Python 远不如扩展常见它,文档确实不包含您需要的所有内容,所以……如果您使用的任何教程都没有涵盖 PySys_* 之类的内容和 Py_GetPath ,您可能需要先找到更好的教程。

    关于python - 如何在 Xcode 中将 Python 函数导入 C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14967435/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com