| Index: script_compiler.py |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/script_compiler.py |
| @@ -0,0 +1,40 @@ |
| +# coding: utf-8 |
| + |
| +# This Source Code Form is subject to the terms of the Mozilla Public |
| +# License, v. 2.0. If a copy of the MPL was not distributed with this |
| +# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| + |
| +import importlib |
| +import inspect |
| + |
| +def multiline_repr(str): |
|
Sebastian Noack
2015/05/19 11:52:41
Nit: Please avoid variable names conflicting with
|
| + return "'''%s'''" % str.replace('\\', '\\\\').replace("'", "\\'") |
|
Sebastian Noack
2015/05/19 11:52:41
Note that you only need to escape quotes if follow
|
| + |
| +def compile_script(main, modules=[]): |
| + ''' |
| + Combines the source code of a main module and a number of additional modules |
| + in a single Python script. |
| + ''' |
| + |
| + yield '#!/usr/bin/env python\n' |
|
Sebastian Noack
2015/05/19 11:52:41
I'd rather pass in the file object and use the pri
|
| + yield 'modules = []\n' |
| + for module in modules + [main]: |
| + path = inspect.getsourcefile(reload(importlib.import_module(module))) |
| + with open(path, 'rb') as file: |
| + data = file.read() |
| + yield 'modules.append((%s, %s))\n' % (repr(module), multiline_repr(data)) |
| + |
| + yield ''' |
| +import imp |
| +import importlib |
|
Sebastian Noack
2015/05/19 11:52:41
importlib isn't used in the generated file.
|
| +import sys |
| + |
| +if __name__ == '__main__': |
| + for module, source in modules: |
|
Sebastian Noack
2015/05/19 11:52:41
IMO, both, the generated and the generating code w
|
| + m = imp.new_module(module) |
| + if (module, source) == modules[-1]: |
| + m.__name__ = __name__ |
| + m.__file__ = __file__ |
| + exec source in m.__dict__ |
| + sys.modules[module] = m |
| +''' |