Coverage for gpaw/cli/main.py: 48%
44 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1"""GPAW command-line tool."""
2import os
3import subprocess
4import sys
7commands = [
8 ('run', 'gpaw.cli.run'),
9 ('info', 'gpaw.cli.info'),
10 ('test', 'gpaw.cli.test'),
11 ('dos', 'gpaw.cli.dos'),
12 ('gpw', 'gpaw.cli.gpw'),
13 ('completion', 'gpaw.cli.completion'),
14 ('atom', 'gpaw.atom.aeatom'),
15 ('diag', 'gpaw.fulldiag'),
16 # ('quick', 'gpaw.cli.quick'),
17 ('python', 'gpaw.cli.python'),
18 ('sbatch', 'gpaw.cli.sbatch'),
19 ('dataset', 'gpaw.atom.generator2'),
20 ('plot-dataset', 'gpaw.atom.plot_dataset'),
21 ('basis', 'gpaw.atom.basisfromfile'),
22 ('plot-basis', 'gpaw.basis_data'),
23 ('symmetry', 'gpaw.symmetry'),
24 ('install-data', 'gpaw.cli.install_data')]
27def hook(parser, args):
28 parser.color = True
29 parser.suggest_on_error = True
30 parser.add_argument('-P', '--parallel', type=int, metavar='N',
31 help='Run on N CPUs.')
32 args = parser.parse_args(args)
34 if args.command == 'python':
35 args.traceback = True
37 if hasattr(args, 'dry_run'):
38 N = int(args.dry_run)
39 if N:
40 import gpaw
41 gpaw.dry_run = N
42 import gpaw.mpi as mpi
43 mpi.world = mpi.SerialCommunicator()
44 mpi.world.size = N
46 if args.parallel:
47 from gpaw.mpi import have_mpi, world
48 if have_mpi and world.size == 1 and args.parallel > 1:
49 py = sys.executable
50 elif not have_mpi:
51 py = 'gpaw-python'
52 else:
53 py = ''
55 if py:
56 # Start again in parallel:
57 pyargs = []
58 if sys.version_info >= (3, 11):
59 # Don't prepend a potentially unsafe path to sys.path
60 pyargs.append('-P')
61 if args.command == 'python' and args.debug:
62 pyargs.append('-d')
63 arguments = ['mpiexec',
64 *os.environ.get('GPAW_MPI_OPTIONS', '').split(),
65 '-np',
66 str(args.parallel),
67 py,
68 *pyargs,
69 '-m',
70 'gpaw',
71 *sys.argv[1:]]
73 # Use a clean set of environment variables without any MPI stuff:
74 p = subprocess.run(arguments, check=False, env=os.environ)
75 sys.exit(p.returncode)
77 return args
80def main(args=None):
81 from gpaw import all_lazy_imports, broadcast_imports, __getattr__
82 with broadcast_imports:
83 for attr in all_lazy_imports:
84 __getattr__(attr)
86 from ase.cli.main import main as ase_main
87 from gpaw import __version__
89 ase_main('gpaw', 'GPAW command-line tool', __version__,
90 commands, hook, args)