Marc-Andre Lemburg <m...@egenix.com> added the comment:

On 08.03.2019 18:50, Jason R. Coombs wrote:
> 
>> It's also easy to bypass that by simply seeding the global cache
>> for uname(): _uname_cache. 
>> Or you could monkey-patch the platform module
>> in your utility to work around the circular reference.
> 
> I don't think these options are possible in the general case. It was what I 
> attempted to do in the first place, but could not. Consider the situation 
> where a namespace package is present or where a script uses pkg_resources to 
> bootstrap itself (a very common case), or any other case where 
> `platform.(anything)` is invoked before the "bypass" or "monkey-patch" has a 
> chance to run. This happens when running the test suite for `cmdix` because 
> pytest invokes pkg_resources to search for entry points and that code invokes 
> `platform.system` (or similar) to evaluate environment markers long before 
> the cmdix code has been imported.

I don't quite follow: since you are the author of the tool, you can of
course have your uname.py import platform and then apply one of the
above tricks, e.g.

"""
#!/usr/bin/env python3
import platform

# Seed uname cache to avoid calling uname
platform._uname_cache = platform.uname_result(
    system='Linux',
    node='moon',
    release='5.99.99',
    version='#1 SMP 2020',
    machine='x86_64',
    processor='x86_64')

print ('Hello from uname.py')
print ('platform.uname() = %r' % (platform.uname(),))
"""

> Here's what happens:
> 
> `platform.(anything)` runs `platform.uname` and `platform.uname` invokes 
> `uname -p` in a subprocess _unconditionally_. Python doesn't provide hooks to 
> monkey-patch that out before it gets invoked.

This is only true for the platform APIs which need information from
uname. Not in general.

>> Or you could call your utility something else.
> 
> The point of this utility is to supply "coreutils" using Python. It's derived 
> from an abandoned project called "pycoreutils", one purpose of which is to 
> provide the core utilities on a minimal Linux distribution that doesn't have 
> uname. Another is to supply coreutils on Windows. Having an alternate name 
> isn't really viable when the purpose is to supply that interface.
> 
> 
> I do think your considerations are reasonable, and I'm close to giving up. I 
> look forward to your feedback on the 'resolved-late' branch.

I don't have anything against making calling of uname lazy.
I also don't have anything against return useful information
rather than "unknown".

Your PR is missing tests, though, to support that it actually
returns the same values are before for a set of common platforms.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35967>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to