GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — pythonnet/src/runtime/Py.cs at master · pythonnet/pythonnet Expand file tree/ Copy pathPy.csMore file actions 184 lines (153 loc) · 5.14 KB / Copy pathPy.csFile metadata and controls184 lines (153 loc) · 5.14 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 namespace Python.Runtime; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading; using Python.Runtime.Native; public static class Py { public static GILState GIL() => PythonEngine.DebugGIL ? new DebugGILState() : new GILState(); public static PyModule CreateScope() => new(); public static PyModule CreateScope(string name) => new(name ?? throw new ArgumentNullException(nameof(name))); public class GILState : IDisposable { private readonly PyGILState state; private bool isDisposed; internal GILState() { state = PythonEngine.AcquireLock(); } public virtual void Dispose() { if (this.isDisposed) return; PythonEngine.ReleaseLock(state); GC.SuppressFinalize(this); this.isDisposed = true; } ~GILState() { throw new InvalidOperationException("GIL must always be released, and it must be released from the same thread that acquired it."); } } public class DebugGILState : GILState { readonly Thread owner; internal DebugGILState() : base() { this.owner = Thread.CurrentThread; } public override void Dispose() { if (this.owner != Thread.CurrentThread) throw new InvalidOperationException("GIL must always be released from the same thread, that acquired it"); base.Dispose(); } } public class KeywordArguments : PyDict { public KeywordArguments() : base() { } protected KeywordArguments(SerializationInfo info, StreamingContext context) : base(info, context) { } } public static KeywordArguments kw(params object?[] kv) { var dict = new KeywordArguments(); if (kv.Length % 2 != 0) { throw new ArgumentException("Must have an equal number of keys and values"); } for (var i = 0; i < kv.Length; i += 2) { if (kv[i] is not string key) throw new ArgumentException("Keys must be non-null strings"); BorrowedReference value; NewReference temp = default; if (kv[i + 1] is PyObject pyObj) { value = pyObj; } else { temp = Converter.ToPythonDetectType(kv[i + 1]); value = temp.Borrow(); } using (temp) { if (Runtime.PyDict_SetItemString(dict, key, value) != 0) { throw new ArgumentException( string.Format("Cannot add key '{0}' to dictionary.", key), innerException: PythonException.FetchCurrent()); } } } return dict; } /// <summary> /// Given a module or package name, import the module and return the resulting object. /// </summary> /// <param name="name">Fully-qualified module or package name</param> public static PyObject Import(string name) => PyModule.Import(name); public static void SetArgv() { IEnumerable<string> args; try { args = Environment.GetCommandLineArgs(); } catch (NotSupportedException) { args = Enumerable.Empty<string>(); } SetArgv(new[] { "" }.Concat(args.Skip(1))); } public static void SetArgv(params string[] argv) { SetArgv(argv as IEnumerable<string>); } public static void SetArgv(IEnumerable<string> argv) { if (argv is null) throw new ArgumentNullException(nameof(argv)); using (GIL()) { string[] arr = argv.ToArray(); Runtime.PySys_SetArgvEx(arr.Length, arr, 0); Runtime.CheckExceptionOccurred(); } } public static void With(PyObject obj, Action<PyObject> Body) { if (obj is null) throw new ArgumentNullException(nameof(obj)); if (Body is null) throw new ArgumentNullException(nameof(Body)); // Behavior described here: // https://docs.python.org/2/reference/datamodel.html#with-statement-context-managers Exception? ex = null; PythonException? pyError = null; try { PyObject enterResult = obj.InvokeMethod("__enter__"); Body(enterResult); } catch (PythonException e) { ex = pyError = e; } catch (Exception e) { ex = e; Exceptions.SetError(e); pyError = PythonException.FetchCurrentRaw(); } PyObject type = pyError?.Type ?? PyObject.None; PyObject val = pyError?.Value ?? PyObject.None; PyObject traceBack = pyError?.Traceback ?? PyObject.None; var exitResult = obj.InvokeMethod("__exit__", type, val, traceBack); if (ex != null && !exitResult.IsTrue()) throw ex; } public static void With(PyObject obj, Action<dynamic> Body) => With(obj, (PyObject context) => Body(context)); } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |