A tool for applying monkeypatches to python executables.
Project description
pymonkey
A tool for applying monkeypatches to python executables.
Installation
pip install pymonkey
Registering a patch
Make a module:
## mymod/pymonkey.py # Be sure to not import anything at the module scope # This ensures that import-hook patching will work better later # This is your chance to do argument parsing before running the target # executable. # This will be called after all of the patch hooks have been registered. def pymonkey_argparse(argv): # You'll be passed the arguments as a tuple. Parse your specific arguments # and return your parsed state and the remaining arguments. # If you wish to forgo argparsing, simply `return None, argv` import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo') return parser.parse_known_args(argv) # This is your entry point. It will be passed module objects after they have # been imported. Check the module name and then apply your patch (if # applicable). # This will be called as a post-import hook so you'll have a chance to modify # the module before another module would import from it. # The parsed state computed above will be passed as `args` def pymonkey_patch(mod, args): # This callback will be called with *every* module that gets imported # Guard against the specific module you'd like to patch if mod.__name__ != 'module_to_patch': return # Apply your patches here to module_to_patch mod.foo = args.foo
And add the entrypoints to setup.py:
setup( ..., entry_points={ 'pymonkey': ['mymod = mymod.pymonkey:pymonkey_patch'], 'pymonkey.argparse': ['mymod = mymod.pymonkey:pymonkey_argparse'], }, ... )
Commandline usage
Applying a single patch:
$ pymonkey mymod -- pip install simplejson
Applying all the patches available:
$ pymonkey --all -- pip install simplejson
Viewing the help
$ pymonkey --help
Making entry points with pymonkey
In a module:
## mymod_main.py from pymonkey import make_entry_point # The first argument is a list of pymonkey patches to apply # The second argument is the entry point to run main = make_entry_point(('mymod',), 'pip') if __name__ == '__main__': exit(main())
In setup.py
setup( ..., entry_points={ 'console_scripts': ['pip-patched = mymod_main:main'], 'pymonkey': ['mymod = mymod.pymonkey:pymonkey_patch'], 'pymonkey.argparse': ['mymod = mymod.pymonkey:pymonkey_argparse'], }, ... )
Then instead of
$ pymonkey mymod -- pip ...
You can now do
$ pip-patched ...
Things using pymonkey
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size pymonkey-0.3.1-py2.py3-none-any.whl (6.5 kB) | File type Wheel | Python version py2.py3 | Upload date | Hashes View |
Filename, size pymonkey-0.3.1.tar.gz (6.1 kB) | File type Source | Python version None | Upload date | Hashes View |
Close
Hashes for pymonkey-0.3.1-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59a4d58785cd6a5734cfcba6dba5eb11595e493be559a141441caaa0e209048d |
|
MD5 | 776548762b9db505f5d18d0b6cb6b058 |
|
BLAKE2-256 | 5122276152db3ee5852de9c127e25c9acd9afe3544e4affa9eea6f31babbe6ab |