gpt4 book ai didi

python - 子目录结构破坏了 C++ 扩展构建

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:53 28 4
gpt4 key购买 nike

<分区>

我似乎无法解决使用子目录结构时导入 C++ 扩展模块不再有效的问题。

下面的两个案例展示了一个简单的工作案例和一个我无法在我的生活中开始工作的稍微改变的案例。

场景 1(工作)

项目树:

demo_cext/         # Current working directory for all of this
├── _cmodule.cc
└── setup.py

setup.py 的内容:

import setuptools

module = setuptools.Extension("_cmod", sources=["_cmodule.cc"], language="c++")

if __name__ == "__main__":
setuptools.setup(name="cmod", ext_modules=[module])

_cmodule.cc 的内容,基本上是 C 扩展的 hello world,它创建了一个函数 foo(),它不接受任何参数并返回 5。

#define PY_SSIZE_T_CLEAN
#include <Python.h>

static PyObject *
foo(PyObject *self, PyObject *args) {
/* noargs() */
if (!PyArg_ParseTuple(args, "")) {
return NULL;
}
return PyLong_FromLong(5);
}

static PyMethodDef FooMethods[] = {
{"foo", foo, METH_VARARGS, "Do the foo"},
{NULL, NULL, 0, NULL}
};

PyDoc_STRVAR(module_doc, "This is the module docstring.");
static struct PyModuleDef cmodule = {
PyModuleDef_HEAD_INIT,
"cmod",
module_doc,
-1,
FooMethods,
NULL,
NULL,
NULL,
NULL
};

PyMODINIT_FUNC
PyInit__cmod(void) {
PyObject* m = PyModule_Create(&cmodule);
if (m == NULL) {
return NULL;
}
return m;
}

整个事情就像一个魅力:

$ python3 -V
Python 3.7.4
$ python3 setup.py build install
>>> import _cmod
>>> _cmod.foo()
5

场景 2(损坏)

将项目重新定位到 the Python docs 中具体涵盖的布局.

$ rm -rf build/ dist/ cmod.egg-info/ && \
> mkdir cmod/ && touch cmod/__init__.py && \
> mv _cmodule.cc cmod/

给我留下:

demo_cext/         # Current working directory for all of this
├── cmod
│   ├── __init__.py
│   └── _cmodule.cc
└── setup.py

我稍微更改了 setup.py:

import setuptools

module = setuptools.Extension("cmod._cmod", sources=["cmod/_cmodule.cc"], language="c++")

if __name__ == "__main__":
setuptools.setup(name="cmod", ext_modules=[module])

现在再次运行后:

$ python3 setup.py build install

尝试导入模块给我留下了:

>>> from cmod import _cmod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name '_cmod' from 'cmod' (.../demo_cext/cmod/__init__.py)
>>> import cmod._cmod
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cmod._cmod'

我这里有什么问题?我敢肯定,命名约定很简单。这似乎直接面对how this is all laid out in the Python docs。 .

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