[Python.NET] Using PyScope to set variables I can use in imported scripts

Denis Akhiyarov denis.akhiyarov at gmail.com
Mon Sep 24 09:36:19 EDT 2018


I copied Wenguang Yang (@yagweb), who developed PyScope.

Steve, did you look at the unit tests for PyScope?

Thanks,
Denis

On Mon, Sep 24, 2018 at 8:28 AM Luke, Steve <Steve.Luke at moldev.com> wrote:

> I am new to Python.Net and trying to convert an application that used
> IronPython to embed a Python environment into a .Net application and allow
> the user to run Python scripts inside our application.  The part that
> embeds the Python environment is VB.Net (but could be C# if that would be
> better).
>
>
> I am running into problems setting variables in the scope such that they
> can be used in the Python scripts we call.  I keep getting an error:
> NameError: global name 'Bridge' is not defined.
>
>
> This is the VB code I am trying to use:
>
>         PythonEngine.Initialize()
>
>         Using (Py.GIL())
>             Dim moduleName As String = "PrintToBridge"
>             Dim pythonCommandLine As String = "Not used yet"
>
>             Dim scope As PyScope = Py.CreateScope()
>             Try
>                 scope.Set("Bridge", bridge)
>                 scope.Set("SetupParams", cmdLine)
>
>                 Dim script As Object = scope.Import(moduleName)
>                 bridge.mm.PrintMsg("Scope has Bridge:" +
> Str(scope.Contains("Bridge")))
>                 script.Startup(pythonCommandLine)
>             Finally
>                 scope.Dispose()
>             End Try
>         End Using
>
> The Python script:
>
> def Startup(param):
>     Bridge.mm.PrintMsg('Startup called')
>
> def Docommand(param):
>     Bridge.mm.PrintMsg('docommand called')
>
> def Shutdown():
>     Bridge.mm.PrintMsg('Shutdown called')
>
>
> How can I set a variable such that it would be recognized by the called
> Python script?  Importing the script works, I can force python-y things to
> happen.  And the check to see if the object I want is in scope returns
> true.  But it still isn't available in Python.
>
>
> I have tried scope.Eval(moduleName + ".Startup('" + pythonCommandLine +
> "')") and Exec() with locals:
>
>                 Dim locals As PyDict = New PyDict()
>                 locals.SetItem("Bridge".ToPython(), bridge.ToPython())
>                 scope.Exec(moduleName + ".Startup('" + pythonCommandLine +
> "')", locals)
>
> All with the same effect.  Any ideas on how to get set variables so
> scripts can gain access to them?
>
>
> Thanks,
>
> Steve
>
>
> Please be advised that this email may contain confidential information. If
> you are not the intended recipient, please notify us by email by replying
> to the sender and delete this message. The sender disclaims that the
> content of this email constitutes an offer to enter into, or the acceptance
> of, any agreement; provided that the foregoing does not invalidate the
> binding effect of any digital or other electronic reproduction of a manual
> signature that is included in any attachment.
> _________________________________________________
> Python.NET mailing list - PythonDotNet at python.org
> https://mail.python.org/mailman/listinfo/pythondotnet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20180924/d1d6f6b2/attachment-0001.html>


More information about the PythonDotNet mailing list