forked from dand-oss/python-cmake-buildsystem
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrun_py_ver.py
108 lines (76 loc) · 2.25 KB
/
run_py_ver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import sys
import os
import setup_py_env
from pathlib import Path
import print_site
from automata import Automata
is_nt = os.name == "nt"
PATHSEP = ";" if is_nt else ":"
def _prepend_path(env, ename, prepend_str):
curpath = env.get(ename, None)
oldpath = "" if not curpath else f"{PATHSEP}{curpath}"
env[ename] = f"{prepend_str}{oldpath}"
def _set_py_env(PR, worklist):
print("\nset_py_env")
# modify copy of env
env = os.environ.copy()
for job in worklist:
ename = job[0]
vallist = job[1:]
# update the env
fpath = PATHSEP.join([str(val) for val in vallist])
_prepend_path(env, ename, fpath)
# report result
print_site.print_env(env, ename)
return env
def set_unix_py_env(PR):
# assume python 3.8
pyvdir = "python3.8"
worklist = (
("PATH", PR / "bin"), # exe
("LD_LIBRARY_PATH", PR / "lib"), # .so
("PYTHONPATH", PR / "lib" / pyvdir, PR / "lib"),
)
return _set_py_env(PR, worklist)
def set_win_py_env(PR):
# Python 3.8 set LoadLibrary for DLLS to IGNORE PATH
# only dlls alongside pyd...
worklist = (
("PATH", PR / "Scripts", PR), # .exe
("PYTHONPATH", PR / "lib", PR / "DLLs"), # pyd
)
return _set_py_env(PR, worklist)
def run_script(a, PR, SCRIPT, ARGS):
print("run_py_ver")
print(f"PYTHONROOT={PR}")
print(f"SCRIPT={SCRIPT}")
# spawn python child env with corrected env
pyexe = setup_py_env.pyexe(PR)
argstr = " ".join(ARGS)
childenv = set_unix_py_env(PR) if not is_nt else set_win_py_env(PR)
a.run_string(f"{pyexe} -s {SCRIPT} {argstr}", env=childenv)
def usage():
msg = f""" \
Usage: python {__file__} python_root script_path
"""
print(msg)
sys.exit(-1)
def main(argv=None):
if argv is None:
argv = sys.argv
if len(argv) < 3:
usage()
# caller to pass pyroot
PR = Path(argv[1])
# and script name to run
SCRIPT = argv[2]
# now arguments to script
ARGS = []
if len(argv) > 2:
ARGS = argv[3:]
logfile = "log.txt"
asi = os.environ["ASI"]
a = Automata(asi, log_name=logfile, showcmds=True, verbose=False)
run_script(a, PR, SCRIPT, ARGS)
if __name__ == "__main__":
sys.exit(main())