Io userei la prima opzione; incorporare lo script bash in una stringa multilinea nello script Python, quindi scrivilo e usa il modulo subprocess
per eseguire lo script:
import tempfile
import subprocess
script_one = '''\
echo "Hello world!"
echo "This is a bash script. :-)"
'''
def run_script(script):
with tempfile.NamedTemporaryFile() as scriptfile:
scriptfile.write(script)
scriptfile.flush()
subprocess.call(['/bin/bash', scriptfile.name])
run_script(script_one)
La funzione run_script()
prende un'origine di script bash, la scrive in un file temporaneo, la esegue e pulisce automaticamente il file temporaneo una volta terminato.
Demo:
$ python /tmp/scripttest.py
Hello world!
This is a bash script. :-)
I decoratori Python non sono di aiuto qui; non ha senso guardare quelli; i decoratori sono semplicemente funzioni Python che riescono a racchiudere altre funzioni Python.
Se lo script è grande, puoi provare a comprimerlo con zlib
, base64
codificarlo, quindi incorporarlo nel file di script Python; utilizzando .decode('base64')
e passando il risultato al modulo zlib
si fornisce nuovamente una stringa decompressa. La compressione ZLIB riduce le dimensioni ma genera dati binari, sempre un po 'più difficile da incorporare senza dover gestire correttamente l'escape e le lunghezze delle linee. La codifica Base64 trasforma nuovamente i dati binari in dati ASCII multi-linea, anche se al prezzo del 25% in più di byte:
>>> import zlib
>>> zlib.compress(script_one).encode('base64')
'eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe\n'
>>> print """script_one = '''\\n{}'''""".format(_)
script_one = '''\
eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe
'''
Nota che per questo breve esempio di script, questa ha aumentato la dimensione, da 54 caratteri a 77, ma per gli script più lunghi dovresti vedere una riduzione decente delle dimensioni.
La decompressione è quindi semplice come zlib.decompress(script_one.decode('base64'))