并提前感谢您在这个问题上能给我的任何帮助。
我正在使用 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 文件的方法?