@@ -234,7 +234,7 @@ def wait_for_worker(status_file: str, timeout: float = 5.0) -> tuple[int, str]:
234234 sys .exit (2 )
235235
236236
237- def start_worker (options_data : str , idx : int ) -> subprocess .Popen [bytes ]:
237+ def start_worker (options_data : str , idx : int , env : Mapping [ str , str ] ) -> subprocess .Popen [bytes ]:
238238 status_file = f".mypy_worker.{ idx } .json"
239239 if os .path .isfile (status_file ):
240240 os .unlink (status_file )
@@ -245,7 +245,7 @@ def start_worker(options_data: str, idx: int) -> subprocess.Popen[bytes]:
245245 f"--status-file={ status_file } " ,
246246 f'--options-data="{ options_data } "' ,
247247 ]
248- return subprocess .Popen (command )
248+ return subprocess .Popen (command , env = env )
249249
250250
251251def get_worker (idx : int , proc : subprocess .Popen [bytes ]) -> WorkerClient :
@@ -268,6 +268,7 @@ def build(
268268 stdout : TextIO | None = None ,
269269 stderr : TextIO | None = None ,
270270 extra_plugins : Sequence [Plugin ] | None = None ,
271+ worker_env : Mapping [str , str ] | None = None ,
271272) -> BuildResult :
272273 """Analyze a program.
273274
@@ -311,15 +312,10 @@ def default_flush_errors(
311312 workers = []
312313 procs = []
313314 if options .num_workers > 0 :
314- if options .use_builtins_fixtures :
315- os .environ ["MYPY_TEST_PREFIX" ] = os .path .dirname (os .path .dirname (__file__ ))
316- if alt_lib_path :
317- os .environ ["MYPY_ALT_LIB_PATH" ] = alt_lib_path
318-
319315 pickled_options = pickle .dumps (options .snapshot ())
320316 options_data = base64 .b64encode (pickled_options ).decode ()
321317 for i in range (options .num_workers ):
322- procs .append (start_worker (options_data , i ))
318+ procs .append (start_worker (options_data , i , worker_env or os . environ ))
323319 for i , proc in enumerate (procs ):
324320 workers .append (get_worker (i , proc ))
325321
@@ -350,6 +346,18 @@ def default_flush_errors(
350346 flush_errors (None , e .messages , serious )
351347 e .messages = messages
352348 raise
349+ finally :
350+ for worker in workers :
351+ try :
352+ send (worker .conn , {"final" : True })
353+ except OSError :
354+ pass
355+ for worker in workers :
356+ worker .conn .close ()
357+ worker .proc .wait ()
358+ status_file = f".mypy_worker.{ worker .idx } .json"
359+ if os .path .isfile (status_file ):
360+ os .unlink (status_file )
353361
354362
355363def build_inner (
@@ -426,19 +434,6 @@ def build_inner(
426434 dump_line_checking_stats (options .line_checking_stats , graph )
427435 return BuildResult (manager , graph )
428436 finally :
429-
430- for worker in workers :
431- try :
432- send (worker .conn , {"final" : True })
433- except OSError :
434- pass
435- for worker in workers :
436- worker .conn .close ()
437- worker .proc .wait ()
438- status_file = f".mypy_worker.{ worker .idx } .json"
439- if os .path .isfile (status_file ):
440- os .unlink (status_file )
441-
442437 t0 = time .time ()
443438 manager .metastore .commit ()
444439 manager .add_stats (cache_commit_time = time .time () - t0 )
0 commit comments