|
|
@ -201,16 +201,13 @@ public class PyVenvRunner : IDisposable, IAsyncDisposable |
|
|
|
// Record output for errors |
|
|
|
// Record output for errors |
|
|
|
var output = new StringBuilder(); |
|
|
|
var output = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
|
|
var outputAction = |
|
|
|
var outputAction = new Action<ProcessOutput>(s => |
|
|
|
outputDataReceived == null |
|
|
|
|
|
|
|
? null |
|
|
|
|
|
|
|
: new Action<ProcessOutput>(s => |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
Logger.Debug($"Pip output: {s.Text}"); |
|
|
|
Logger.Debug($"Pip output: {s.Text}"); |
|
|
|
// Record to output |
|
|
|
// Record to output |
|
|
|
output.Append(s.Text); |
|
|
|
output.Append(s.Text); |
|
|
|
// Forward to callback |
|
|
|
// Forward to callback |
|
|
|
outputDataReceived(s); |
|
|
|
outputDataReceived?.Invoke(s); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
SetPyvenvCfg(PyRunner.PythonDir); |
|
|
|
SetPyvenvCfg(PyRunner.PythonDir); |
|
|
@ -427,10 +424,19 @@ public class PyVenvRunner : IDisposable, IAsyncDisposable |
|
|
|
if (Process is { HasExited: false }) |
|
|
|
if (Process is { HasExited: false }) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Process.Kill(); |
|
|
|
Process.Kill(); |
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
{ |
|
|
|
await Process |
|
|
|
await Process |
|
|
|
.WaitForExitAsync(new CancellationTokenSource(1000).Token) |
|
|
|
.WaitForExitAsync(new CancellationTokenSource(1000).Token) |
|
|
|
.ConfigureAwait(false); |
|
|
|
.ConfigureAwait(false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
catch (OperationCanceledException e) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Logger.Error(e, "Venv Process did not exit in time in DisposeAsync"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Process.CancelStreamReaders(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Process = null; |
|
|
|
Process = null; |
|
|
|
GC.SuppressFinalize(this); |
|
|
|
GC.SuppressFinalize(this); |
|
|
|