---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-beaac7fd8e8a> in <module>
11 y = yaml.load(conda_env_yaml)
12 from pathlib import Path
---> 13 yaml.dump(y, Path("/tmp/test.yml"))
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/main.py in dump(self, data, stream, _kw, transform)
447 if stream is None:
448 raise TypeError('Need a stream argument when not dumping from context manager')
--> 449 return self.dump_all([data], stream, _kw, transform=transform)
450
451 def dump_all(self, documents, stream, _kw=enforce, transform=None):
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/main.py in dump_all(self, documents, stream, _kw, transform)
461 self._context_manager = YAMLContextManager(self, transform=transform)
462 for data in documents:
--> 463 self._context_manager.dump(data)
464 self._context_manager.teardown_output()
465 self._output = None
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/main.py in dump(self, data)
813 self.init_output(data)
814 try:
--> 815 self._yaml.representer.represent(data)
816 except AttributeError:
817 # nprint(dir(dumper._representer))
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/representer.py in represent(self, data)
84 # type: (Any) -> None
85 node = self.represent_data(data)
---> 86 self.serializer.serialize(node)
87 self.represented_objects = {}
88 self.object_keeper = []
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/serializer.py in serialize(self, node)
115 )
116 self.anchor_node(node)
--> 117 self.serialize_node(node, None, None)
118 self.emitter.emit(DocumentEndEvent(explicit=self.use_explicit_end))
119 self.serialized_nodes = {}
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/serializer.py in serialize_node(self, node, parent, index)
230 )
231 for key, value in node.value:
--> 232 self.serialize_node(key, node, None)
233 self.serialize_node(value, node, key)
234 self.emitter.emit(MappingEndEvent(comment=[map_comment, end_comment]))
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/serializer.py in serialize_node(self, node, parent, index)
178 node.value,
179 style=node.style,
--> 180 comment=node.comment,
181 )
182 )
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in emit(self, event)
252 while not self.need_more_events():
253 self.event = self.events.pop(0)
--> 254 self.state()
255 self.event = None
256
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in expect_first_block_mapping_key(self)
662 def expect_first_block_mapping_key(self):
663 # type: () -> None
--> 664 return self.expect_block_mapping_key(first=True)
665
666 def expect_block_mapping_key(self, first=False):
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in expect_block_mapping_key(self, first)
687 pass
688 self.states.append(self.expect_block_mapping_simple_value)
--> 689 self.expect_node(mapping=True, simple_key=True)
690 if isinstance(self.event, AliasEvent):
691 self.stream.write(u' ')
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in expect_node(self, root, sequence, mapping, simple_key)
420 if isinstance(self.event, ScalarEvent):
421 # nprint('@', self.indention, self.no_newline, self.column)
--> 422 self.expect_scalar()
423 elif isinstance(self.event, SequenceStartEvent):
424 # nprint('@', self.indention, self.no_newline, self.column)
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in expect_scalar(self)
468 # type: () -> None
469 self.increase_indent(flow=True)
--> 470 self.process_scalar()
471 self.indent = self.indents.pop()
472 self.state = self.states.pop()
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in process_scalar(self)
883 self.write_literal(self.analysis.scalar, self.event.comment)
884 else:
--> 885 self.write_plain(self.analysis.scalar, split)
886 self.analysis = None
887 self.style = None
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/ruamel/yaml/emitter.py in write_plain(self, text, split)
1614 data = data.encode(self.encoding)
1615 try:
-> 1616 self.stream.write(data)
1617 except: # NOQA
1618 sys.stdout.write(repr(data) + '\n')
~/opt/miniconda3/envs/btml-dev/lib/python3.7/site-packages/fastcore/utils.py in write(self, txt, encoding)
428 "Write `txt` to `self`, creating directories as needed"
429 self.parent.mkdir(parents=True,exist_ok=True)
--> 430 with self.open('w', encoding=encoding) as f: f.write(txt)
431
432 # Cell
TypeError: write() argument must be str, not bytes
After looking into this, the reason was the following code in the fastcore/utils.py file:
@patch
def write(self:Path, txt, encoding='utf8'):
"Write `txt` to `self`, creating directories as needed"
self.parent.mkdir(parents=True,exist_ok=True)
with self.open('w', encoding=encoding) as f: f.write(txt)
This made it very hard to integrate fastai2 with BentoML for model serving, or for anything that uses ruamel.yaml
. It may break other packages too. I think in general libraries should avoid this type of global patching especially on core modules like pathlib.