Python code minifier, obfuscator, and compressor
Project description
Pyminifier is a Python code minifier, obfuscator, and compressor.
Overview
When you install pyminifier it should automatically add a ‘pyminifier’ executable to your $PATH. This executable has a number of command line arguments:
$ pyminifier --help
Usage: pyminifier [options] "<input file>"
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-o <file path>, --outfile=<file path>
Save output to the given file.
-d <file path>, --destdir=<file path>
Save output to the given directory. This option is
required when handling multiple files. Defaults to
'./minified' and will be created if not present.
--nominify Don't bother minifying (only used with --pyz).
--use-tabs Use tabs for indentation instead of spaces.
--bzip2 bzip2-compress the result into a self-executing python
script. Only works on stand-alone scripts without
implicit imports.
--gzip gzip-compress the result into a self-executing python
script. Only works on stand-alone scripts without
implicit imports.
--lzma lzma-compress the result into a self-executing python
script. Only works on stand-alone scripts without
implicit imports.
--pyz=<name of archive>.pyz
zip-compress the result into a self-executing python
script. This will create a new file that includes any
necessary implicit (local to the script) modules.
Will include/process all files given as arguments to
pyminifier.py on the command line.
-O, --obfuscate Obfuscate all function/method names, variables, and
classes. Default is to NOT obfuscate.
--obfuscate-classes Obfuscate class names.
--obfuscate-functions
Obfuscate function and method names.
--obfuscate-variables
Obfuscate variable names.
--obfuscate-import-methods
Obfuscate globally-imported mouled methods (e.g.
'Ag=re.compile').
--obfuscate-builtins Obfuscate built-ins (i.e. True, False, object,
Exception, etc).
--replacement-length=1
The length of the random names that will be used when
obfuscating identifiers.
--nonlatin Use non-latin (unicode) characters in obfuscation
(Python 3 only). WARNING: This results in some
SERIOUSLY hard-to-read code.
--prepend=<file path>
Prepend the text in this file to the top of our
output. e.g. A copyright notice.
For the examples below we’ll be minifying, obfuscating, and compressing the following totally made-up Python script (saved to /tmp/tumult.py):
#!/usr/bin/env python """ tumult.py - Because everyone needs a little chaos every now and again. """ try: import demiurgic except ImportError: print("Warning: You're not demiurgic. Actually, I think that's normal.") try: import mystificate except ImportError: print("Warning: Dark voodoo may be unreliable.") # Globals ATLAS = False # Nothing holds up the world by default class Foo(object): """ The Foo class is an abstract flabbergaster that when instantiated represents a discrete dextrogyratory inversion of a cattywompus octothorp. """ def __init__(self, *args, **kwargs): """ The initialization vector whereby the ineffably obstreperous becomes paramount. """ # TODO. BTW: What happens if we remove that docstring? :) def demiurgic_mystificator(self, dactyl): """ A vainglorious implementation of bedizenment. """ inception = demiurgic.palpitation(dactyl) # Note the imported call demarcation = mystificate.dark_voodoo(inception) return demarcation def test(self, whatever): """ This test method tests the test by testing your patience. """ print(whatever) if __name__ == "__main__": print("Forming...") f = Foo("epicaricacy", "perseverate") f.test("Codswallop")
By default pyminifier will perform basic minification and print the resulting code to stdout:
#!/usr/bin/env python
ﵛ=ImportError
ࡅ=print
㮀=False
搓=object
try:
import demiurgic
except ﵛ:
ࡅ("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
import mystificate
except ﵛ:
ࡅ("Warning: Dark voodoo may be unreliable.")
ﵩ=㮀
class רּ(搓):
def __init__(self,*args,**kwargs):
pass
def 𐨱(self,dactyl):
ﱲ=demiurgic.palpitation(dactyl)
ꁁ=mystificate.dark_voodoo(ﱲ)
return ꁁ
def 𨠅(self,whatever):
ࡅ(whatever)
if __name__=="__main__":
ࡅ("Forming...")
녂=רּ("epicaricacy","perseverate")
녂.𨠅("Codswallop")
# Created by pyminifier.py (https://github.com/liftoff/pyminifier)
This reduced the size of tumult.py from 1358 bytes to 640 bytes. Not bad!
Minifying by itself can reduce code size considerably but pyminifier can go further by obfuscating the code. What that means is that it will replace the names of things like variables and functions to the smallest possible size.
To see more examples of pyminifier in action (e.g. compression features) see the full documentation
Special Sauce
So let’s pretend for a moment that your intentions are not pure; that you totally want to mess with the people that look at your minified code. What you need is Python 3 and the --nonlatin option…
#!/usr/bin/env python3
ܗ=ImportError
ܡ=print
ܪ=False
ٽ=object
try:
import demiurgic
except ܗ:
ܡ("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
import mystificate
except ܗ:
ܡ("Warning: Dark voodoo may be unreliable.")
ܬ=ܪ
class ظ(ٽ):
def __init__(self,*args,**kwargs):
pass
def ط(self,dactyl):
ټ=demiurgic.palpitation(dactyl)
ⶹ=mystificate.dark_voodoo(ټ)
return ⶹ
def ܘ(self,whatever):
ܡ(whatever)
if __name__=="__main__":
ܡ("Forming...")
f=ظ("epicaricacy","perseverate")
f.test("Codswallop")
# Created by pyminifier.py (https://github.com/liftoff/pyminifier)
Yes, that code actually works but only using Python 3. This is because Python 3 supports coding in languages that use non-latin character sets.
There’s even more ways to mess with people in the full documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file pyminifier-2.1.tar.gz
.
File metadata
- Download URL: pyminifier-2.1.tar.gz
- Upload date:
- Size: 47.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e192618fe901830e9298825b32828bc9555ae8649e05af37bfab2db328546777 |
|
MD5 | c1a6b92e69f664005f7adf188c514de7 |
|
BLAKE2b-256 | 2c8a946b0b43e0912c907aba42507073675c2e4a4a836c5b1ce10be6f12575d0 |