I am trying to use portage python API in spyder, the following simple code import portage p = portage.db[portage.root]["porttree"].dbapi triggers an exception: File /usr/lib/python3.11/site-packages/spyder_kernels/py3compat.py:356 in compat_exec exec(code, globals, locals) File ~/.config/spyder-py3/temp.py:10 p = portage.db[portage.root]["porttree"].dbapi File /usr/lib/python3.11/site-packages/portage/proxy/objectproxy.py:44 in __getitem__ return object.__getattribute__(self, "_get_target")()[key] File /usr/lib/python3.11/site-packages/portage/__init__.py:807 in _get_target return _get_legacy_global(name) File /usr/lib/python3.11/site-packages/portage/_legacy_globals.py:41 in _get_legacy_global portage.db = portage.create_trees(**kwargs) File /usr/lib/python3.11/site-packages/portage/__init__.py:641 in create_trees settings = config( File /usr/lib/python3.11/site-packages/portage/proxy/objectproxy.py:30 in __call__ return result(*args, **kwargs) File /usr/lib/python3.11/site-packages/portage/package/ebuild/config.py:644 in __init__ self.repositories = load_repository_config(self) File /usr/lib/python3.11/site-packages/portage/repository/config.py:1361 in load_repository_config return RepoConfigLoader(repoconfigpaths, settings) File /usr/lib/python3.11/site-packages/portage/repository/config.py:1070 in __init__ writemsg_level( File /usr/lib/python3.11/site-packages/portage/util/__init__.py:150 in writemsg_level writemsg(msg, noiselevel=noiselevel, fd=fd) File /usr/lib/python3.11/site-packages/portage/util/__init__.py:123 in writemsg fd = fd.buffer AttributeError: 'TTYOutStream' object has no attribute 'buffer' where inside the spyder ipython console I have In [1]: type(sys.stderr) Out[1]: spyder_kernels.console.outstream.TTYOutStream where TTYOutStream is derived from OutStream which is derived from TextIOBase in ipykernel.iostream.py In a regular ipython console I have In [1]: type(sys.stderr) Out[1]: _io.TextIOWrapper Is this a problem of portage, spyder or ipython?
It uses the buffer attribute so that it can write raw bytes and avoid unicode encoding issues for non-UTF-8 locales. So, we need TTYOutStream to provide some kind of compatible interface to write bytes, or else for UTF8 locales it should be safe use it as a text stream.