2

并提前感谢您在这个问题上能给我的任何帮助。

我正在使用 cython 生成的 .c 文件部署一个 python 项目,该文件具有以下配置setup.py

. . .

setup(

    . . .,

    packages=[
        "hatchet",
        "hatchet.readers",
        "hatchet.util",
        "hatchet.external",
        "hatchet.tests",
        "hatchet.cython_modules.libs",
    ],
    install_requires=["pydot", "PyYAML", "matplotlib", "numpy", "pandas"],
    ext_modules=[
        Extension(
            "hatchet.cython_modules.libs.subtract_metrics",
            ["hatchet/cython_modules/subtract_metrics.c"]
        ),
        Extension(
            "hatchet.cython_modules.libs.graphframe_modules",
            ["hatchet/cython_modules/graphframe_modules.c"]
        )
    ],
)

在我们的主实现目录中,该__init__.py文件包含以下代码行:

from .graphframe import GraphFrame
from .query_matcher import QueryMatcher

__version_info__ = ("1", "2", "0")
__version__ = ".".join(__version_info__)

使用python setup.py install我构建此项目时,出现以下错误:

Traceback (most recent call last):
File "/usr/WS1/scullyal/hatchet/hatchet/graphframe.py", line 24, in <module>
    import hatchet.cython_modules.libs.graphframe_modules as _gfm_cy
ModuleNotFoundError: No module named 'hatchet.cython_modules.libs.graphframe_modules'
Traceback (most recent call last):
  File "setup.py", line 10, in <module>
    from hatchet import __version__
  File "/usr/WS1/scullyal/hatchet/hatchet/__init__.py", line 9, in <module>
    from .graphframe import GraphFrame
  File "/usr/WS1/scullyal/hatchet/hatchet/graphframe.py", line 24, in <module>
    import hatchet.cython_modules.libs.graphframe_modules as _gfm_cy
ModuleNotFoundError: No module named 'hatchet.cython_modules.libs.graphframe_modules'

正如我已经确定的那样,问题来自一个伪循环依赖项,其中 setup.py 脚本必须运行__init__.py才能执行其安装;__init__.py但是-- -- 中的这一行from .graphframe import GraphFrame依赖于尚未构建的扩展,并且在安装过程进入构建扩展阶段之前不会构建。

出于命名空间的原因,我们需要此行(有关在init .py模块导入和 __init__.py 在 Python中导入模块的解释,请参见此处的最佳答案),以确保我们正在开发的面向用户的 API 不会变得过于冗长。我做了一些研究,但我无法找到指定安装脚本执行顺序的方法。我还想避免在遇到此异常时尝试构建模块的 hacky 解决方案。

有没有人可以解决这个问题?一种我可以保留导入行__init__.py并确保在执行之前构建必要的 .c 文件的方法?

4

0 回答 0