【问题标题】:Compiling and linking C extension for Python in Xcode for Mac在 Xcode for Mac 中编译和链接 Python 的 C 扩展
【发布时间】:2012-11-10 17:30:39
【问题描述】:

我正在尝试在 Mac 中编译一个简单的 C 扩展以与 Python 一起使用,并且在命令行中一切正常。下面介绍了有效的代码和 gcc 命令。 现在我正在尝试在 Xcode 4.5 (Mac OS10.8) 中构建相同的扩展,并且我为 dylib 或静态库尝试了几个目标设置,但我总是得到一个无法在 Python 中加载的文件,显示错误:

./myModule.so: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A

我的最终目标是在 XCode 中使用 C/C++ 扩展的源代码创建一个工作区,并拥有在 Xcode 中调用它的 python 脚本。所以,如果我需要调试 C/C++ 扩展,我有 XCode 调试功能。我知道 XCode 不会调试到 Python 脚本,但它可以运行它,对吗?

gcc -shared -arch i386 -arch x86_64 -L/usr/lib/python2.7 -framework python -I/usr/include/python2.7 -o myModule.so myModule.c -v

#include <Python.h>

/*
 * Function to be called from Python
 */
static PyObject* py_myFunction(PyObject* self, PyObject* args)
{
    char *s = "Hello from C!";
    return Py_BuildValue("s", s);
}   

/*
 * Another function to be called from Python
 */
static PyObject* py_myOtherFunction(PyObject* self, PyObject* args)
{
    double x, y;
    PyArg_ParseTuple(args, "dd", &x, &y);
    return Py_BuildValue("d", x*y);
}

/*
 * Bind Python function names to our C functions
 */
static PyMethodDef myModule_methods[] = {
    {"myFunction", py_myFunction, METH_VARARGS},
    {"myOtherFunction", py_myOtherFunction, METH_VARARGS},
    {NULL, NULL}
};

/*
 * Python calls this to let us initialize our module
 */
void initmyModule()
{
    (void) Py_InitModule("myModule", myModule_methods);
}

【问题讨论】:

  • 前 8 个字节解码为 "!\n"。这对你来说意味着什么?

标签: python c xcode static


【解决方案1】:

This guy seems to be having the same problem

我已经找到了问题所在。即使我更改了 xcode 中的设置以指定输出类型“动态库”或“捆绑”,xcode 也忽略了该设置。启动一个新的 BSD 动态库项目解决了我看到的问题。感谢您的帮助!

【讨论】:

    【解决方案2】:

    我在 XCode 4.6 中使用 setuptools、virtualenv、unittest 和 GDB 作为调试器成功地调试了单元测试的 C 扩展。

    我使用 virtualenvwrapper 为项目创建一个 virtualenv,然后将 ~/.virtualenvs/module_name/bin/python 设置为要调试的可执行文件。

    在运行配置中传递给 virtualenv python 解释器的单个参数是 test.py 的路径。

    然后我将 GDB 而不是 None 设置为自动启动它的调试器。

    最后一步是将“setup.py install”作为参数传递给测试目标的外部构建工具配置窗格中的构建工具 (~/.virtualenvs/module_name/bin/python)。 virtualenv 提供了一种相当简单的方法,您可以将 C 扩展的共享对象安装到测试脚本 python 解释器的库路径中,而无需实际将其安装到主机的全局站点包中。

    通过此设置,我可以从 python 脚本调用扩展代码(最终目标),并且仍然使用 XCode 的 GUI 调试支持来调试 C 代码。

    如果我没有清楚地描述这一点,请告诉我,我将分享一个示例项目。

    【讨论】:

    • 作为奖励,我可以在 IntelliJ/IDEA (PyCharm) 中调试测试的 Python 端,同时将 Xcode 中的 GDB 调试器附加到测试运行器进程以同时调试 C 扩展端在 Xcode 中。
    • 示例项目会有所帮助!
    猜你喜欢
    • 2023-03-11
    • 2020-04-04
    • 2012-09-17
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2010-12-03
    相关资源
    最近更新 更多