praiskup / argparse-manpage

Automatically build man-pages for your Python project
Apache License 2.0
41 stars 22 forks source link

EPEL7 has issues with returning an argparser from function #45

Closed FrostyX closed 2 years ago

FrostyX commented 2 years ago

Quoting @praiskup here:

I think argparse-manpage is broken for EL7 for the "function" mechanism. That's because the runpy-evaluated function sees all the imports from within the file as None objects (they are defined, but None) on EL7.

For this, I would probably prefer fixing the manpage generator first, or keep the parser top-level for now (as it is mostly a cosmetic thing). Or find some work-around.

See https://github.com/praiskup/resalloc/pull/77

praiskup commented 2 years ago

Minimal reproducer:

[root@abdd4a932efa /]# cat test-file 
#! /bin/python

import argparse

def get_parser():
        parser = argparse.ArgumentParser()
        parser.add_argument("test")
        return parser

if __name__ == "__main__":
        get_parser().parse_args()
[root@abdd4a932efa /]# argparse-manpage  --pyfile test-file --function get_parser
Traceback (most recent call last):
  File "/usr/bin/argparse-manpage", line 9, in <module>
    load_entry_point('argparse-manpage==2', 'console_scripts', 'argparse-manpage')()
  File "/usr/lib/python2.7/site-packages/build_manpages/cli/__init__.py", line 64, in main
    parser = get_parser(import_type, import_from, obj_name, obj_type)
  File "/usr/lib/python2.7/site-packages/build_manpages/build_manpage.py", line 43, in get_parser
    return get_parser_from_file(import_from, objname, objtype)
  File "/usr/lib/python2.7/site-packages/build_manpages/build_manpage.py", line 38, in get_parser_from_file
    return get_obj(filedict[objname], objtype)
  File "/usr/lib/python2.7/site-packages/build_manpages/build_manpage.py", line 19, in get_obj
    return obj()
  File "test-file", line 6, in get_parser
    parser = argparse.ArgumentParser()
AttributeError: 'NoneType' object has no attribute 'ArgumentParser'

And then just with runpy:

[root@abdd4a932efa /]# cat expose 
#! /bin/python2

import runpy
translated = runpy.run_path("test-file")
translated["get_parser"]()
[root@abdd4a932efa /]# ./expose 
Traceback (most recent call last):
  File "./expose", line 5, in <module>
    translated["get_parser"]()
  File "test-file", line 6, in get_parser
    parser = argparse.ArgumentParser()
AttributeError: 'NoneType' object has no attribute 'ArgumentParser'