Skip to content

Commit fcff962

Browse files
authored
Fix omegaconf parser mode failing on spawned processes (#784)
1 parent 2fd10c6 commit fcff962

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ Fixed
4444
values (`#773 <https://github.com/omni-us/jsonargparse/pull/773>`__).
4545
- ``save`` with ``multifile=True`` not saving separate subconfigs for items in a
4646
list (`#779 <https://github.com/omni-us/jsonargparse/pull/779>`__).
47+
- ``omegaconf`` parser mode failing on spawned processes (`#784
48+
<https://github.com/omni-us/jsonargparse/pull/784>`__).
4749

4850

4951
v4.41.0 (2025-09-04)

jsonargparse/_core.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
get_loader_exceptions,
6565
load_value,
6666
loaders,
67-
set_omegaconf_loader,
6867
)
6968
from ._namespace import (
7069
Namespace,
@@ -1613,10 +1612,9 @@ def parser_mode(self) -> str:
16131612

16141613
@parser_mode.setter
16151614
def parser_mode(self, parser_mode: str):
1616-
if parser_mode in {"omegaconf", "omegaconf+"}:
1617-
set_omegaconf_loader(parser_mode)
1618-
if parser_mode not in loaders:
1619-
raise ValueError(f"The only accepted values for parser_mode are {set(loaders)}.")
1615+
accepted = set(loaders).union({"omegaconf", "omegaconf+"})
1616+
if parser_mode not in accepted:
1617+
raise ValueError(f"The only accepted values for parser_mode are {accepted}.")
16201618
if parser_mode == "jsonnet":
16211619
import_jsonnet("parser_mode=jsonnet")
16221620
self._parser_mode = parser_mode

jsonargparse/_loaders_dumpers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,12 @@ def load_value(value: str, simple_types: bool = False, **kwargs):
196196
loaded_value = load_basic(value)
197197

198198
mode = get_load_value_mode()
199-
if loaded_value is not_loaded and not loader_json_superset[mode]:
199+
if loaded_value is not_loaded and not loader_json_superset.get(mode, True):
200200
loaded_value = load_list_or_dict(value)
201201

202202
if loaded_value is not_loaded:
203+
if mode not in loaders and mode in {"omegaconf", "omegaconf+"}:
204+
set_omegaconf_loader(mode)
203205
loader = loaders[mode]
204206
load_kwargs = {}
205207
if kwargs and mode in loader_params:

jsonargparse_tests/test_omegaconf.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import json
44
import math
5+
import multiprocessing
56
import os
67
from dataclasses import dataclass
78
from pathlib import Path
@@ -224,3 +225,27 @@ def test_omegaconf_absolute_to_relative_paths():
224225
"h": "${.f[0]}",
225226
}
226227
assert omegaconf_absolute_to_relative_paths(data) == expected
228+
229+
230+
def parse_in_spawned_process(queue, parser, args):
231+
try:
232+
cfg = parser.parse_args(args)
233+
queue.put(cfg)
234+
except Exception as ex:
235+
queue.put(ex)
236+
237+
238+
@skip_if_omegaconf_unavailable
239+
def test_omegaconf_in_spawned_process(parser):
240+
parser.parser_mode = "omegaconf"
241+
parser.add_argument("--dict", type=dict)
242+
assert parser.parse_args(['--dict={"x":1}']).dict == {"x": 1}
243+
244+
ctx = multiprocessing.get_context("spawn")
245+
queue = ctx.Queue()
246+
process = ctx.Process(target=parse_in_spawned_process, args=(queue, parser, ['--dict={"x":2}']))
247+
process.start()
248+
process.join()
249+
250+
cfg = queue.get()
251+
assert cfg.dict == {"x": 2}

0 commit comments

Comments
 (0)