OILS / opy / _regtest / src / build / runpy_deps.py View on Github | oilshell.org

97 lines, 65 significant
1#!/usr/bin/python -S
2from __future__ import print_function
3"""
4runpy_deps.py
5
6NOTE: -S above is important.
7"""
8
9import sys # 15 modules
10import runpy # 34 modules
11
12PY_MODULE = 0
13C_MODULE = 1
14
15
16def FilterModules(modules, stdlib_dir):
17 stdlib_dir_len = len(stdlib_dir)
18
19 for name in sorted(modules):
20 mod = modules[name]
21 if name in ('__builtin__', '__main__'):
22 continue
23
24 try:
25 full_path = mod.__file__
26 except AttributeError:
27 full_path = None
28
29 # If it's cached, it will be under .pyc; otherwise under .py.
30 if full_path and full_path.endswith('.py'):
31 py_path = full_path
32 pyc_path = full_path + 'c'
33 elif full_path and full_path.endswith('.pyc'):
34 pyc_path = full_path
35 py_path = full_path[:-1]
36 else:
37 # Print a different format for C modules.
38 yield C_MODULE, name, full_path
39
40 if py_path:
41 if py_path.startswith(stdlib_dir):
42 rel_py_path = py_path[stdlib_dir_len:]
43 else:
44 rel_py_path = py_path
45
46 # .pyc file for execution
47 yield PY_MODULE, py_path, rel_py_path
48
49
50def main(argv):
51 runpy_path = runpy.__file__
52 i = runpy_path.rfind('/')
53 assert i != -1, runpy_path
54 stdlib_dir = runpy_path[: i + 1] # include trailing slash
55
56 action = argv[1]
57
58 if action == 'both':
59 path_prefix = argv[2]
60
61 py_out_path = path_prefix + '/runpy-deps-cpython.txt'
62 c_out_path = path_prefix + '/runpy-deps-c.txt'
63
64 # NOTE: This is very similar to build/app_deps.py.
65 with open(py_out_path, 'w') as py_out, open(c_out_path, 'w') as c_out:
66 for mod_type, x, y in FilterModules(sys.modules, stdlib_dir):
67 if mod_type == PY_MODULE:
68 print(x, y, file=py_out)
69 print(x + 'c', y + 'c', file=py_out) # .pyc goes in bytecode.zip too
70 pass
71
72 elif mod_type == C_MODULE:
73 print(x, y, file=c_out) # mod_name, full_path
74
75 else:
76 raise AssertionError(mod_type)
77
78 print('-- Wrote %s and %s' % (py_out_path, c_out_path), file=sys.stderr)
79
80 elif action == 'py':
81 for mod_type, full_path, rel_path in \
82 FilterModules(sys.modules, stdlib_dir):
83 if mod_type == PY_MODULE:
84 opy_input = full_path
85 opy_output = rel_path + 'c' # output is .pyc
86 print(opy_input, opy_output)
87
88 else:
89 raise RuntimeError('Invalid action %r' % action)
90
91
92if __name__ == '__main__':
93 try:
94 main(sys.argv)
95 except RuntimeError as e:
96 print('%s: %s' % (sys.argv[0], e.args[0]), file=sys.stderr)
97 sys.exit(1)