| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| (Empty) | |
| 1 # coding: utf-8 | |
| 2 | |
| 3 # This Source Code Form is subject to the terms of the Mozilla Public | |
| 4 # License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
| 6 | |
| 7 import importlib | |
| 8 import inspect | |
| 9 | |
| 10 def multiline_repr(str): | |
|
Sebastian Noack
2015/05/19 11:52:41
Nit: Please avoid variable names conflicting with
| |
| 11 return "'''%s'''" % str.replace('\\', '\\\\').replace("'", "\\'") | |
|
Sebastian Noack
2015/05/19 11:52:41
Note that you only need to escape quotes if follow
| |
| 12 | |
| 13 def compile_script(main, modules=[]): | |
| 14 ''' | |
| 15 Combines the source code of a main module and a number of additional modules | |
| 16 in a single Python script. | |
| 17 ''' | |
| 18 | |
| 19 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
| |
| 20 yield 'modules = []\n' | |
| 21 for module in modules + [main]: | |
| 22 path = inspect.getsourcefile(reload(importlib.import_module(module))) | |
| 23 with open(path, 'rb') as file: | |
| 24 data = file.read() | |
| 25 yield 'modules.append((%s, %s))\n' % (repr(module), multiline_repr(data)) | |
| 26 | |
| 27 yield ''' | |
| 28 import imp | |
| 29 import importlib | |
|
Sebastian Noack
2015/05/19 11:52:41
importlib isn't used in the generated file.
| |
| 30 import sys | |
| 31 | |
| 32 if __name__ == '__main__': | |
| 33 for module, source in modules: | |
|
Sebastian Noack
2015/05/19 11:52:41
IMO, both, the generated and the generating code w
| |
| 34 m = imp.new_module(module) | |
| 35 if (module, source) == modules[-1]: | |
| 36 m.__name__ = __name__ | |
| 37 m.__file__ = __file__ | |
| 38 exec source in m.__dict__ | |
| 39 sys.modules[module] = m | |
| 40 ''' | |
| OLD | NEW |