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

1"""GPAW command-line tool.""" 

2import os 

3import subprocess 

4import sys 

5 

6 

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')] 

25 

26 

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) 

33 

34 if args.command == 'python': 

35 args.traceback = True 

36 

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 

45 

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 = '' 

54 

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:]] 

72 

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) 

76 

77 return args 

78 

79 

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) 

85 

86 from ase.cli.main import main as ase_main 

87 from gpaw import __version__ 

88 

89 ase_main('gpaw', 'GPAW command-line tool', __version__, 

90 commands, hook, args)