使用pybind11-stubgen生成pyi文件时出现No Module Named错误的相关疑问
嗨,我太懂你这种“自己明明能正常导入模块,工具却死活找不到”的抓狂感了!先直接给你个准信:你猜的没错,pybind11-stubgen确实需要模块处于Python的可导入路径范围内——你平时能正常用,大概率是因为开发目录刚好在当前Python环境的sys.path里,但stubgen的模块查找逻辑更依赖标准的可导入路径,所以才会出现这种“近在眼前却找不到”的情况。
不过完全不用搞复杂的pip包发布那套流程,针对你这种频繁重建的私有开发模块,有两个超轻量的解决办法:
临时路径注入(适合快速单次生成)
不用安装模块,只要在运行stubgen前临时把模块所在目录加到Python环境变量里就行。比如你的模块就在当前工作目录,直接跑这个命令:PYTHONPATH=. pybind11-stubgen {你的模块名}这个操作只是临时给stubgen开个“绿色通道”,不会在环境里留下任何持久化改动,用完就没痕迹,特别适合临时跑一次stub生成的场景。
可编辑模式安装(适合长期迭代开发)
如果你需要频繁生成stub,更推荐用pip install -e的“可编辑安装”方式,这绝对算不上过度设计,反而会让你开发更顺手。你只需要在模块目录下写个极简的setup.py(或者pyproject.toml)就行,比如:from setuptools import setup, Extension setup( name="你的模块名", ext_modules=[Extension("你的模块名", sources=["你的cpp源文件列表"])], )然后在终端运行
pip install -e .。这种安装方式只是把你的开发目录链接到Python的site-packages里,你每次重新编译模块,stubgen都能直接找到最新版本,完全不用重复安装,完美匹配你频繁重建的需求。
说白了,你平时能导入是因为当前环境的sys.path“开了后门”,但stubgen不认这个后门,上面两种方法就是给它开个合法的“入口”,完全不用搞复杂的打包流程。
备注:内容来源于stack exchange,提问作者Andrew Voelkel

