Skip to content

Commit 64e483c

Browse files
committed
wrap bare open() calls in context managers to prevent file handle leaks (#241)
1 parent 3975bbd commit 64e483c

1 file changed

Lines changed: 67 additions & 56 deletions

File tree

mkconcore.py

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
# - Sets the executable permission (`stat.S_IRWXU`) for the generated scripts on POSIX systems.
6464

6565
from bs4 import BeautifulSoup
66+
import atexit
6667
import logging
6768
import re
6869
import sys
@@ -104,13 +105,16 @@
104105
M_IS_OCTAVE = True #treat .m as octave 9/27/21
105106

106107
if os.path.exists(CONCOREPATH+"/concore.mcr"): # 11/12/21
107-
MCRPATH = open(CONCOREPATH+"/concore.mcr", "r").readline().strip() #path to local Ubunta Matlab Compiler Runtime
108+
with open(CONCOREPATH+"/concore.mcr", "r") as f:
109+
MCRPATH = f.readline().strip() #path to local Ubunta Matlab Compiler Runtime
108110

109111
if os.path.exists(CONCOREPATH+"/concore.sudo"): # 12/04/21
110-
DOCKEREXE = open(CONCOREPATH+"/concore.sudo", "r").readline().strip() #to omit sudo in docker
112+
with open(CONCOREPATH+"/concore.sudo", "r") as f:
113+
DOCKEREXE = f.readline().strip() #to omit sudo in docker
111114

112115
if os.path.exists(CONCOREPATH+"/concore.repo"): # 12/04/21
113-
DOCKEREPO = open(CONCOREPATH+"/concore.repo", "r").readline().strip() #docker id for repo
116+
with open(CONCOREPATH+"/concore.repo", "r") as f:
117+
DOCKEREPO = f.readline().strip() #docker id for repo
114118

115119

116120
prefixedgenode = ""
@@ -166,6 +170,12 @@
166170
funlock = open("unlock", "w") # 12/4/21
167171
fparams = open("params", "w") # 9/18/22
168172

173+
def cleanup_script_files():
174+
for fh in [fbuild, frun, fdebug, fstop, fclear, fmaxtime, funlock, fparams]:
175+
if not fh.closed:
176+
fh.close()
177+
atexit.register(cleanup_script_files)
178+
169179
os.mkdir("src")
170180
os.chdir("..")
171181

@@ -179,8 +189,8 @@
179189
logging.info(f"MCR path: {MCRPATH}")
180190
logging.info(f"Docker repository: {DOCKEREPO}")
181191

182-
f = open(GRAPHML_FILE, "r")
183-
text_str = f.read()
192+
with open(GRAPHML_FILE, "r") as f:
193+
text_str = f.read()
184194

185195
soup = BeautifulSoup(text_str, 'xml')
186196

@@ -410,121 +420,125 @@
410420
#copy proper concore.py into /src
411421
try:
412422
if concoretype=="docker":
413-
fsource = open(CONCOREPATH+"/concoredocker.py")
423+
with open(CONCOREPATH+"/concoredocker.py") as fsource:
424+
source_content = fsource.read()
414425
else:
415-
fsource = open(CONCOREPATH+"/concore.py")
426+
with open(CONCOREPATH+"/concore.py") as fsource:
427+
source_content = fsource.read()
416428
except (FileNotFoundError, IOError) as e:
417429
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
418430
quit()
419431
with open(outdir+"/src/concore.py","w") as fcopy:
420-
fcopy.write(fsource.read())
421-
fsource.close()
432+
fcopy.write(source_content)
422433

423434
#copy proper concore.hpp into /src 6/22/21
424435
try:
425436
if concoretype=="docker":
426-
fsource = open(CONCOREPATH+"/concoredocker.hpp")
437+
with open(CONCOREPATH+"/concoredocker.hpp") as fsource:
438+
source_content = fsource.read()
427439
else:
428-
fsource = open(CONCOREPATH+"/concore.hpp")
440+
with open(CONCOREPATH+"/concore.hpp") as fsource:
441+
source_content = fsource.read()
429442
except (FileNotFoundError, IOError) as e:
430443
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
431444
quit()
432445
with open(outdir+"/src/concore.hpp","w") as fcopy:
433-
fcopy.write(fsource.read())
434-
fsource.close()
446+
fcopy.write(source_content)
435447

436448
#copy proper concore.v into /src 6/25/21
437449
try:
438450
if concoretype=="docker":
439-
fsource = open(CONCOREPATH+"/concoredocker.v")
451+
with open(CONCOREPATH+"/concoredocker.v") as fsource:
452+
source_content = fsource.read()
440453
else:
441-
fsource = open(CONCOREPATH+"/concore.v")
454+
with open(CONCOREPATH+"/concore.v") as fsource:
455+
source_content = fsource.read()
442456
except (FileNotFoundError, IOError) as e:
443457
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
444458
quit()
445459
with open(outdir+"/src/concore.v","w") as fcopy:
446-
fcopy.write(fsource.read())
447-
fsource.close()
460+
fcopy.write(source_content)
448461

449462
#copy mkcompile into /src 5/27/21
450463
try:
451-
fsource = open(CONCOREPATH+"/mkcompile")
464+
with open(CONCOREPATH+"/mkcompile") as fsource:
465+
source_content = fsource.read()
452466
except (FileNotFoundError, IOError) as e:
453467
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
454468
quit()
455469
with open(outdir+"/src/mkcompile","w") as fcopy:
456-
fcopy.write(fsource.read())
457-
fsource.close()
470+
fcopy.write(source_content)
458471
os.chmod(outdir+"/src/mkcompile",stat.S_IRWXU)
459472

460473
#copy concore*.m into /src 4/2/21
461474
try: #maxtime in matlab 11/22/21
462-
fsource = open(CONCOREPATH+"/concore_default_maxtime.m")
475+
with open(CONCOREPATH+"/concore_default_maxtime.m") as fsource:
476+
source_content = fsource.read()
463477
except (FileNotFoundError, IOError) as e:
464478
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
465479
quit()
466480
with open(outdir+"/src/concore_default_maxtime.m","w") as fcopy:
467-
fcopy.write(fsource.read())
468-
fsource.close()
481+
fcopy.write(source_content)
469482
try:
470-
fsource = open(CONCOREPATH+"/concore_unchanged.m")
483+
with open(CONCOREPATH+"/concore_unchanged.m") as fsource:
484+
source_content = fsource.read()
471485
except (FileNotFoundError, IOError) as e:
472486
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
473487
quit()
474488
with open(outdir+"/src/concore_unchanged.m","w") as fcopy:
475-
fcopy.write(fsource.read())
476-
fsource.close()
489+
fcopy.write(source_content)
477490
try:
478-
fsource = open(CONCOREPATH+"/concore_read.m")
491+
with open(CONCOREPATH+"/concore_read.m") as fsource:
492+
source_content = fsource.read()
479493
except (FileNotFoundError, IOError) as e:
480494
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
481495
quit()
482496
with open(outdir+"/src/concore_read.m","w") as fcopy:
483-
fcopy.write(fsource.read())
484-
fsource.close()
497+
fcopy.write(source_content)
485498
try:
486-
fsource = open(CONCOREPATH+"/concore_write.m")
499+
with open(CONCOREPATH+"/concore_write.m") as fsource:
500+
source_content = fsource.read()
487501
except (FileNotFoundError, IOError) as e:
488502
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
489503
quit()
490504
with open(outdir+"/src/concore_write.m","w") as fcopy:
491-
fcopy.write(fsource.read())
492-
fsource.close()
505+
fcopy.write(source_content)
493506
try: #4/9/21
494-
fsource = open(CONCOREPATH+"/concore_initval.m")
507+
with open(CONCOREPATH+"/concore_initval.m") as fsource:
508+
source_content = fsource.read()
495509
except (FileNotFoundError, IOError) as e:
496510
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
497511
quit()
498512
with open(outdir+"/src/concore_initval.m","w") as fcopy:
499-
fcopy.write(fsource.read())
500-
fsource.close()
513+
fcopy.write(source_content)
501514
try: #11/19/21
502-
fsource = open(CONCOREPATH+"/concore_iport.m")
515+
with open(CONCOREPATH+"/concore_iport.m") as fsource:
516+
source_content = fsource.read()
503517
except (FileNotFoundError, IOError) as e:
504518
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
505519
quit()
506520
with open(outdir+"/src/concore_iport.m","w") as fcopy:
507-
fcopy.write(fsource.read())
508-
fsource.close()
521+
fcopy.write(source_content)
509522
try: #11/19/21
510-
fsource = open(CONCOREPATH+"/concore_oport.m")
523+
with open(CONCOREPATH+"/concore_oport.m") as fsource:
524+
source_content = fsource.read()
511525
except (FileNotFoundError, IOError) as e:
512526
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
513527
quit()
514528
with open(outdir+"/src/concore_oport.m","w") as fcopy:
515-
fcopy.write(fsource.read())
516-
fsource.close()
529+
fcopy.write(source_content)
517530
try: # 4/4/21
518531
if concoretype=="docker":
519-
fsource = open(CONCOREPATH+"/import_concoredocker.m")
532+
with open(CONCOREPATH+"/import_concoredocker.m") as fsource:
533+
source_content = fsource.read()
520534
else:
521-
fsource = open(CONCOREPATH+"/import_concore.m")
535+
with open(CONCOREPATH+"/import_concore.m") as fsource:
536+
source_content = fsource.read()
522537
except (FileNotFoundError, IOError) as e:
523538
logging.error(f"{CONCOREPATH} is not correct path to concore: {e}")
524539
quit()
525540
with open(outdir+"/src/import_concore.m","w") as fcopy:
526-
fcopy.write(fsource.read())
527-
fsource.close()
541+
fcopy.write(source_content)
528542

529543
# --- Generate iport and oport mappings ---
530544
logging.info("Generating iport/oport mappings...")
@@ -593,25 +607,27 @@
593607
if not os.path.exists(outdir+"/src/Dockerfile."+dockername): # 3/30/21
594608
try:
595609
if langext=="py":
596-
fsource = open(CONCOREPATH+"/Dockerfile.py")
610+
src_path = CONCOREPATH+"/Dockerfile.py"
597611
logging.info("assuming .py extension for Dockerfile")
598612
elif langext == "cpp": # 6/22/21
599-
fsource = open(CONCOREPATH+"/Dockerfile.cpp")
613+
src_path = CONCOREPATH+"/Dockerfile.cpp"
600614
logging.info("assuming .cpp extension for Dockerfile")
601615
elif langext == "v": # 6/26/21
602-
fsource = open(CONCOREPATH+"/Dockerfile.v")
616+
src_path = CONCOREPATH+"/Dockerfile.v"
603617
logging.info("assuming .v extension for Dockerfile")
604618
elif langext == "sh": # 5/19/21
605-
fsource = open(CONCOREPATH+"/Dockerfile.sh")
619+
src_path = CONCOREPATH+"/Dockerfile.sh"
606620
logging.info("assuming .sh extension for Dockerfile")
607621
else:
608-
fsource = open(CONCOREPATH+"/Dockerfile.m")
622+
src_path = CONCOREPATH+"/Dockerfile.m"
609623
logging.info("assuming .m extension for Dockerfile")
624+
with open(src_path) as fsource:
625+
source_content = fsource.read()
610626
except:
611627
logging.error(f"{CONCOREPATH} is not correct path to concore")
612628
quit()
613629
with open(outdir+"/src/Dockerfile."+dockername,"w") as fcopy:
614-
fcopy.write(fsource.read())
630+
fcopy.write(source_content)
615631
if langext=="py":
616632
fcopy.write('CMD ["python", "-i", "'+sourcecode+'"]\n')
617633
if langext=="m":
@@ -622,7 +638,6 @@
622638
if langext=="v":
623639
fcopy.write('RUN iverilog ./'+sourcecode+'\n') # 7/02/21
624640
fcopy.write('CMD ["./a.out"]\n') # 7/02/21
625-
fsource.close()
626641

627642
fbuild.write('#!/bin/bash' + "\n")
628643
for node in nodes_dict:
@@ -1110,10 +1125,6 @@
11101125
frun.close()
11111126
fbuild.close()
11121127
fdebug.close()
1113-
fstop.close()
1114-
fclear.close()
1115-
fmaxtime.close()
1116-
fparams.close()
11171128
if concoretype != "windows":
11181129
os.chmod(outdir+"/build",stat.S_IRWXU)
11191130
os.chmod(outdir+"/run",stat.S_IRWXU)

0 commit comments

Comments
 (0)