private void PythonProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Data))
            {
                return;
            }
            string data = e.Data;

            if (e.Data.Contains("STDERR:"))
            {
                data = e.Data.Split(new char[] { ':' }, 2)[1];
            }
            Console.WriteLine("stderr[" + State + "]:" + e.Data);

            switch (State)
            {
            case STATE_RUNNING:
            {
                OnStdErr?.Invoke(data);
                hasRunError = true;
            }
            break;

            case STATE_COMPILING:
            {
                OnStdErr?.Invoke(data);
                hasCompileError = true;
            }
            break;
            }
        }
        /// <summary>
        /// if there is an error in this function, you didn't setup the VisibleInPython attribute with a backing field
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        void UpdateProxyProperty(string name, string value)
        {
            Type                     proxyType = proxy.GetType();
            PropertyInfo             prop      = proxyType.GetProperty(name);
            VisibleInPythonAttribute attr      = (VisibleInPythonAttribute)prop.GetCustomAttribute(typeof(VisibleInPythonAttribute));
            FieldInfo                field     = proxyType.GetField(attr.BackingField, BindingFlags.Instance | BindingFlags.NonPublic);

            try
            {
                object castedValue = Convert.ChangeType(value, field.FieldType);
                field.SetValue(proxy, castedValue);
                OnValueUpdatedOnProxy?.Invoke(name, proxy);
            }
            catch (Exception)
            {
                string err = "Python provided a bad value (" + value + ") for property " + name;
                OnStdErr?.Invoke(err);
                OnBadValue?.Invoke(err);
            }
        }