Unable to run any of the examples provided on the main page
Guimoute opened this issue · 6 comments
Hello,
For some reason, I cannot run any of the examples provided on the main page. Are there special requirements that are not listed? My python version is 3.8.7.
Here is a simple script that is used to test the five examples and log the error traceback to a file. All you need to change is EXAMPLE = 1|2|3|4|5
in the constants.
# Imports.
import mgz
import os
# Constants.
PATH = "test.aoe2record"
EXAMPLE = 5
# Redirect the error to a file.
with open(f"log_example_{EXAMPLE}.txt", "w") as log_file:
# Open a game and get information.
try:
with open(PATH, "rb") as data:
if EXAMPLE == 1:
from mgz import header, body
eof = os.fstat(data.fileno()).st_size
header.parse_stream(data)
body.meta.parse_stream(data)
while data.tell() < eof:
body.operation.parse_stream(data)
elif EXAMPLE == 2:
from mgz import header, fast
eof = os.fstat(data.fileno()).st_size
header.parse_stream(data)
fast.meta(data)
while data.tell() < eof:
fast.operation(data)
elif EXAMPLE == 3:
from mgz.summary import Summary
s = Summary(data)
s.get_map()
s.get_platform()
elif EXAMPLE == 4:
from mgz.model import parse_match
match = parse_match(data)
match.map.name
match.file.perspective.number
elif EXAMPLE == 5:
import json
from mgz.model import parse_match, serialize
match = parse_match(data)
print(json.dumps(serialize(match), indent=2))
except Exception:
import traceback
log_file.write(traceback.format_exc())
test.zip contains test.aoe2record
.
Manually looking at the header, this game has the following characteristics:
data = open(test.aoe2record, "rb")
from mgz.summary import *
header = decompress(data)
version, game, save, log = parse_version(header, data)
>>> version = <Version.DE: 21>
>>> game = 'VER 9.4'
>>> save = 25.22
>>> log = 5
The 5 tracebacks are here:
log_example_1.txt
log_example_2.txt
log_example_3.txt
log_example_4.txt
log_example_5.txt
The 5 top-most errors are:
construct.core.ConstError: expected b'\x00\x0b' but parsed b'\x00\x00'
construct.core.ConstError: expected b'\x00\x0b' but parsed b'\x00\x00'
construct.core.ConstError: expected b'\x00\x0b' but parsed b'\x00\x00'
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz\fast\header.py", line 48, in de_string
assert data.read(2) == b'\x60\x0a'
AssertionError
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz\fast\header.py", line 48, in de_string
assert data.read(2) == b'\x60\x0a'
AssertionError
Thank you in advance for your help.
Are you using the latest version of mgz
? You'll need to git clone
the repository to get it.
I updated construct
from 2.8.16 to 2.10.68 and now import mgz
causes an error, so I cannot check the version. I got it via pip
though, not on github. I'll try with github.
ImportError: cannot import name 'Embedded' from 'construct' (C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\construct\__init__.py)
Edit: it was mgz-1.7.3
that I got via pip. I am installing 1.7.4 right now.
I reverted the construct upgrade.
With a manual install of mgz-1.7.4
I have the three first examples that work. Examples 4 and 5 yield a different error now.
Traceback (most recent call last):
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 463, in parse
players, mod = parse_players(header, num_players, version)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 430, in parse_players
players = [parse_player(header, number, num_players) for number in range(num_players)]
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 430, in <listcomp>
players = [parse_player(header, number, num_players) for number in range(num_players)]
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 116, in parse_player
name, resources = unpack(f'<{name_length - 1}s2xIx', header)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 33, in unpack
output = struct.unpack(fmt, data.read(struct.calcsize(fmt)))
struct.error: bad char in struct format
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "REDACTED/PATH/TO/MY/PROGRAM", line 49, in <module>
match = parse_match(data)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\model\__init__.py", line 93, in parse_match
data = parse(handle)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 467, in parse
raise RuntimeError("could not parse")
RuntimeError: could not parse
Traceback (most recent call last):
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 463, in parse
players, mod = parse_players(header, num_players, version)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 430, in parse_players
players = [parse_player(header, number, num_players) for number in range(num_players)]
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 430, in <listcomp>
players = [parse_player(header, number, num_players) for number in range(num_players)]
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 116, in parse_player
name, resources = unpack(f'<{name_length - 1}s2xIx', header)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 33, in unpack
output = struct.unpack(fmt, data.read(struct.calcsize(fmt)))
struct.error: bad char in struct format
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "REDACTED/PATH/TO/MY/PROGRAM", line 56, in <module>
match = parse_match(data)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\model\__init__.py", line 93, in parse_match
data = parse(handle)
File "C:\WPy64-3870\python-3.8.7.amd64\lib\site-packages\mgz-1.7.4-py3.8.egg\mgz\fast\header.py", line 467, in parse
raise RuntimeError("could not parse")
RuntimeError: could not parse
Ok, now you are seeing expected behavior. 4 and 5 (relying on "fast mode") aren't compatible with the latest version of DE, yet. You'll want to use the "full mode"/Summary
to parse the latest recs.
Ok, thank you so much for your fast reply!