plateau2minecraft icon indicating copy to clipboard operation
plateau2minecraft copied to clipboard

outputに./data/output以外を指定するとエラーになる問題を修正

Open u-one opened this issue 8 months ago • 0 comments

以下のように --output のパラメタに ./data/output/ 以外のpathを指定すると最後のファイル保存処理で 出力pathが見つからない旨のエラーになりました。

原因は実装の一部が、outputの引数に関係なく./data/output/ 以下を出力先を想定している実装になっているようです。

現象

エラー発生時のコマンドとエラー内容:

>poetry run python -m plateau2minecraft --target ./data/53393420_bldg_6697_op.gml --output ./output
2025-06-01 16:13:27,167 - INFO - Processing start: data\53393420_bldg_6697_op.gml
2025-06-01 16:13:27,168 - INFO - Triangulation: data\53393420_bldg_6697_op.gml
2025-06-01 16:16:07,445 - INFO - Voxelize: data\53393420_bldg_6697_op.gml
2025-06-01 16:18:06,700 - INFO - Processing end: data\53393420_bldg_6697_op.gml
2025-06-01 16:18:06,700 - INFO - Merging: [WindowsPath('data/53393420_bldg_6697_op.gml')]
2025-06-01 16:18:06,754 - INFO - To : [WindowsPath('data/53393420_bldg_6697_op.gml')]
origin_point: (15529769.0, 4246305.0)
save: r.-2.-1.mca
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "D:\oss\plateau2minecraft\src\plateau2minecraft\__main__.py", line 49, in <module>
    region = Minecraft(merged).build_region(args.output)
  File "D:\oss\plateau2minecraft\src\plateau2minecraft\converter.py", line 89, in build_region
    region.save(f"{output}/world_data/region/{block_id}")
  File "D:\oss\plateau2minecraft\src\plateau2minecraft\anvil\empty_region.py", line 348, in save
    with open(file, "wb") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'output/world_data/region/r.-2.-1.mca'

原因

具体的には、以下の処理は ./data/output/world_data/region が出力先として固定pathになっている。

  • 出力先のpath存在チェック
  • 存在する場合のファイル削除
  • 存在しない場合のpath作成

一方、最終的に生成ファイルの出力先だけ {output}/world_data/region となるようになっている。

その結果、outputパラメタが ./data/output/ を指定している場合は問題ないようですが、 これ以外を指定するとpathがあらかじめ存在する場合以外はファイルsave時にpathが存在せずエラーとなるようです。

修正内容

上記の一部pathが固定されている箇所をすべて、 {output}/world_data/region となり一貫したpathを参照するよう修正しました。

動作確認

ディレクトリが存在しない状態で以下2パターンを実行

poetry run python -m plateau2minecraft --target ./data/53393420_bldg_6697_op.gml --output ./output

./output/world_data/region にファイルが生成される

poetry run python -m plateau2minecraft --target ./data/53393420_bldg_6697_op.gml --output ./data/output

./data/output/world_data/region にファイルが生成される

ディレクトリと生成ファイルが存在する状態で以下を実行

poetry run python -m plateau2minecraft --target ./data/53393420_bldg_6697_op.gml --output ./data/output

./data/output/world_data/regionのファイルが一度削除されて再び生成される

u-one avatar Jun 01 '25 07:06 u-one