info
重構 Biomes 過程遇到的問題,涉及比較技術細節的故障排除所以額外發一篇文分開講。
原始錯誤
Exception occurred during build:
Traceback (most recent call last):
File "impl/materializers.py", line 1783, in materialize
File "impl/materializers.py", line 716, in materialize_ToIcon_Flora
File "impl/vox.py", line 739, in iconify_voxel_array
File "impl/render_voxels.py", line 111, in render_map
ModuleNotFoundError: No module named 'numpy.core.multiarray'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "build.py", line 65, in exec_program
File "impl/lru_cache_by_hash.py", line 30, in set_default
File "impl/lru_cache_by_hash.py", line 24, in make_value_cached
File "build.py", line 66, in <lambda>
File "impl/materializers.py", line 1785, in materialize
impl.types.MaterializationError: Error materializing node: DerivedNode(kind='ToIcon_Flora', deps=[Flora:0x1fc2cb2e4002fa67], dep_hashes=['57036fed7713db64e4fb917e35d1c6cc5436883b'])
執行上下文

整個呼叫鏈是從 HTTP request 觸發,在 Nest.js 內部 spawn 一個副程式,
而該副程式是透過 pyinstaller 打包的 Python 程式,
並且該程式又 import 了 另外一個透過 pybind11 打包的 C++ (實作的)動態函式庫。
出現問題的 render_voxels.py 則是「透過 pyinstaller 打包的 Python 程式」當中的一部分。
解決方法
在 build.py 所在的專案改變 numpy 的版本:
// pyproject.toml
- "numpy>=1.26.0",
+ "numpy==1.26.4",
直後重新用 pyinstaller 打包一份新的執行檔。