mujoco_py/utils.py (50 lines of code) (raw):
import sys
import os
import copy
from os.path import join, expanduser, exists
import numpy as np
MISSING_MUJOCO_MESSAGE = '''
You appear to be missing MuJoCo. We expected to find the file here: {}
This package only provides python bindings, the library must be installed separately.
Please follow the instructions on the README to install MuJoCo
https://github.com/openai/mujoco-py#install-mujoco
Which can be downloaded from the website
https://www.roboti.us/index.html
'''
def remove_empty_lines(string):
lines = []
for line in string.splitlines():
if line.strip():
lines.append(line)
return "\n".join(lines)
def rec_assign(node, assign):
# Assigns values to node recursively.
# This is neccessary to avoid overriding pointers in MuJoCo.
for field in dir(node):
if field.find("__") == -1 and field != 'uintptr':
val = getattr(node, field)
if isinstance(val, (int, bool, float, None.__class__, str)):
setattr(node, field, assign[field])
elif isinstance(val, np.ndarray):
val[:] = assign[field][:]
elif not hasattr(val, "__call__"):
rec_assign(val, assign[field])
def rec_copy(node):
# Recursively copies object to dictionary.
# Applying directly copy.deepcopy causes seg fault.
ret = {}
for field in dir(node):
if field.find("__") == -1:
val = getattr(node, field)
if isinstance(val, (int, bool, float, None.__class__, str)):
ret[field] = val
elif isinstance(val, np.ndarray):
ret[field] = copy.deepcopy(val)
elif not hasattr(val, "__call__"):
ret[field] = rec_copy(val)
return ret
def discover_mujoco():
"""
Discovers where MuJoCo is located in the file system.
Currently assumes path is in ~/.mujoco
Returns:
- mujoco_path (str): Path to MuJoCo 2.1 directory.
"""
mujoco_path = os.getenv('MUJOCO_PY_MUJOCO_PATH')
if not mujoco_path:
mujoco_path = join(expanduser('~'), '.mujoco', 'mujoco210')
# We get lots of github issues that seem to be missing these
# so check that mujoco is really there and raise errors if not.
if not exists(mujoco_path):
message = MISSING_MUJOCO_MESSAGE.format(mujoco_path)
print(message, file=sys.stderr)
raise Exception(message)
return mujoco_path