Title: Passing an arbitrary .NET object as the value of an attribute of PyObject by yagweb · Pull Request #373 · pythonnet/pythonnet · GitHub
Open Graph Title: Passing an arbitrary .NET object as the value of an attribute of PyObject by yagweb · Pull Request #373 · pythonnet/pythonnet
X Title: Passing an arbitrary .NET object as the value of an attribute of PyObject by yagweb · Pull Request #373 · pythonnet/pythonnet
Description: This implement the function of passing an arbitrary .NET object as attribute of PyObject by dynamic type. Four modifications are located at file pyobject.cs, the methods for dynamic type TryGetMember and TrySetMember were modified, a new method GetAttrDynamic was added for TryGetMember, and a new method SetAttrDynamic was added for TrySetMember. Unit tests were given in a new file "src/embed_tests/dynamic.cs". An Example was given in the discussion of issue #370 , the Solution 4. /Information below is outdated and can be removed**/ However this doesn't fix the issue why sys.stdout returned null #370 ... ... I don't know where to put the test, so I put it here. If needed, it can be added to Embedded tests with some work. class dynamicTest { public void Test() { var output = new Output(); using (Py.GIL()) { dynamic sys = Py.Import("sys"); sys.stdout = output; //Now it's working //function test, print in python PythonEngine.RunSimpleString("print('Hello!')"); //Check whether there are the same object var result1 = sys.stdout == output; Console.WriteLine($"Compare in .NET: {result1}"); //Output True //Check whether we can get the attr of a python object //when the value of attr is not a .NET object PythonEngine.RunSimpleString("import sys\n" + "from io import StringIO\n" + "sys.stderr = StringIO()\n"); var bb = sys.stderr; bb.write("Hello!\n"); Console.Write(bb.getvalue()); /********Pass the .NET object in Python side*********/ PythonEngine.RunSimpleString("import sys\n" + "from io import StringIO\n" + "sys.stderr = sys.stdout\n"); //Compare in Python PythonEngine.RunSimpleString("import sys\n" + "print('Compare in Python: %s' % (sys.stderr is sys.stdout))\n"); //Output False //compare in .NET var result2 = sys.stdout == sys.stderr; Console.WriteLine($"Compare in .NET: {result2}"); //Output True /*********Pass the .NET object in .NET side********/ sys.stdout = sys.stderr; //Compare in Python PythonEngine.RunSimpleString("import sys\n" + "print('Compare in Python: %s' % (sys.stderr is sys.stdout))\n"); //Output False //compare in .NET var result3 = sys.stdout == sys.stderr; Console.WriteLine($"Compare in .NET: {result3}"); //Output True /*********When the .NET object was created in Python side*****************/ PythonEngine.RunSimpleString(@" import sys from Test import Output sys.stderr = Output() "); var aa = sys.stderr; //Return the .NET object, not a PyObject with an IntPtr aa.write("Hello!\n"); } } } public class Output { public void write(String str) { //str = str.Replace("\n", Environment.NewLine); Console.Write(str); } public void writelines(String[] str) { foreach (String line in str) { Console.Write(str); } } public void flush() { } public void close() { } }
Open Graph Description: This implement the function of passing an arbitrary .NET object as attribute of PyObject by dynamic type. Four modifications are located at file pyobject.cs, the methods for dynamic type TryGetMemb...
X Description: This implement the function of passing an arbitrary .NET object as attribute of PyObject by dynamic type. Four modifications are located at file pyobject.cs, the methods for dynamic type TryGetMemb...
Opengraph URL: https://github.com/pythonnet/pythonnet/pull/373
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/checks(.:format) |
| route-controller | pull_requests |
| route-action | checks |
| fetch-nonce | v2:d264361e-d999-5b51-8f66-ff89f9a0b0d0 |
| current-catalog-service-hash | 87dc3bc62d9b466312751bfd5f889726f4f1337bdff4e8be7da7c93d6c00a25a |
| request-id | DC82:2736BD:105C769:15CD60A:6970576A |
| html-safe-nonce | d645826dfe6b8a15bd2426045eb7be2ba80b295f66e7f8799720d1c86c27f78f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQzgyOjI3MzZCRDoxMDVDNzY5OjE1Q0Q2MEE6Njk3MDU3NkEiLCJ2aXNpdG9yX2lkIjoiNjYxMTEyNjI4MTU1Njc0NDA0MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | fb880a1d86640ddce38018727e3830edf12039c25e2ac7be346cfd9a185950e6 |
| hovercard-subject-tag | pull_request:105574492 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,checks,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/pythonnet/pythonnet/pull/373/checks |
| twitter:image | https://avatars.githubusercontent.com/u/13247575?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/13247575?s=400&v=4 |
| og:image:alt | This implement the function of passing an arbitrary .NET object as attribute of PyObject by dynamic type. Four modifications are located at file pyobject.cs, the methods for dynamic type TryGetMemb... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | 9920a62ba22d06470388e2904804fb7e5ec51c9e35f81784e9191394c74b2bd2 |
| turbo-cache-control | no-preview |
| go-import | github.com/pythonnet/pythonnet git https://github.com/pythonnet/pythonnet.git |
| octolytics-dimension-user_id | 6050430 |
| octolytics-dimension-user_login | pythonnet |
| octolytics-dimension-repository_id | 14748123 |
| octolytics-dimension-repository_nwo | pythonnet/pythonnet |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 14748123 |
| octolytics-dimension-repository_network_root_nwo | pythonnet/pythonnet |
| turbo-body-classes | logged-out env-production page-responsive full-width full-width-p-0 |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | f643964067a552f02067066d6a910b2f90a5721f |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width