【问题标题】:ModuleNotFound when trying to install Python Extension Module (Cython) inside the same package specified in setup.py尝试在 setup.py 中指定的同一包中安装 Python 扩展模块(Cython)时发现 ModuleNotFound
【发布时间】:2021-01-11 04:17:56
【问题描述】:

我有一个 Python 项目的 Cython 扩展模块,我想安装到与安装项目相同的命名空间。当我尝试在扩展中指定将其安装在包本身中时,无法找到并导入它。如果我指定扩展位于 Python 命名空间的根目录中,它可以正常工作,但它不在我想要的模块命名空间中。如何让扩展模块可以从与包本身相同的命名空间导入?

我为这个问题做了一个简单的测试用例。

文件夹结构:

mypkg
├── foo
│   ├── __init__.py
│   └── barCy.pyx
└── setup.py

.barCy.pyx 文件:

cpdef long bar():
    return 0

setup.py 代码:

import distutils.extension
from Cython.Build import cythonize

from setuptools import setup, find_packages

extensions = [distutils.extension.Extension("foo.bar",
                                            ['foo/barCy.pyx'])]
setup(
        name='foo',
        packages=find_packages(),
        ext_modules=cythonize(extensions),
        )

__init.py__ 为空。

我希望能够做到:

>>> import foo.bar as bar
>>> bar.bar()
0

相反,我得到了

>>> import foo.bar as bar
ModuleNotFoundError: No module named 'foo.bar'

如果我要将Extension("foo.bar",... 更改为Extension("bar",...,那么我可以将import bar 视为顶级包。虽然这是预期的行为,但这不是我想要的,因为我只希望可以通过 foo 命名空间访问此扩展模块。

【问题讨论】:

  • 这能回答你的问题吗? Python: importing a sub‑package or sub‑module
  • 不,这个问题与如何在已导入的模块上使用 import 语句有关,而不必像往常一样解析完整的模块路径。这里的问题是嵌套扩展模块根本不可导入,并且不是foo 包命名空间的一部分。编译后的.so文件出现在正确的位置,但无法导入。

标签: python package cython setuptools


【解决方案1】:

我的 Python 解释器是在与 setup.py 脚本相同的文件夹中运行的,所以 import foo 正在导入本地包,而不是安装在 Python 解释器的 site-packages 目录中的包。因为它们具有相同的文件夹结构,所以选择本地目录作为替代导入包。

从与源不同的文件夹进行测试/运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多