2015-05-21 16 views
8

Mam następujący C# kod gdzie mogę zadzwonić skrypt Pythona z C#:W jaki sposób przekazywać argumenty do skryptu Pythona z IronPython

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using System.Windows.Forms; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using IronPython.Hosting; 
using Microsoft.Scripting.Hosting; 
using IronPython.Runtime; 

namespace RunPython 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(null); 
      ScriptRuntime runtime = new ScriptRuntime(setup); 
      ScriptEngine engine = Python.GetEngine(runtime); 
      ScriptSource source = engine.CreateScriptSourceFromFile("HelloWorld.py"); 
      ScriptScope scope = engine.CreateScope(); 
      source.Execute(scope); 
     } 
    } 
} 

mam problemy ze zrozumieniem każdy wiersz kodu, ponieważ moje doświadczenie z C# jest ograniczona. Jak zmodyfikować ten kod w celu przekazania argumentu wiersza poleceń do mojego skryptu Pythona, gdy go uruchomię?

+0

Możliwa duplikat https://stackoverflow.com/questions/5949735/how-can-i-pass-command-line-arguments- in-ironpython – IronManMark20

Odpowiedz

5

Dziękuję wszystkim za wskazujące mnie we właściwym kierunku. Z jakiegoś powodu engine.sys wydaje się nie działać dla nowszych wersji IronPython, więc zamiast tego należy użyć GetSysModule. Oto poprawiona wersja mojego kodu, który pozwala mi zmieniać argv:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using System.Windows.Forms; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using IronPython.Hosting; 
using Microsoft.Scripting; 
using Microsoft.Scripting.Hosting; 
using IronPython.Runtime; 

namespace RunPython 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(null); 
      ScriptRuntime runtime = new ScriptRuntime(setup); 
      ScriptEngine engine = Python.GetEngine(runtime); 
      ScriptSource source = engine.CreateScriptSourceFromFile("HelloWorld.py"); 
      ScriptScope scope = engine.CreateScope(); 
      List<String> argv = new List<String>(); 
      //Do some stuff and fill argv 
      argv.Add("foo"); 
      argv.Add("bar"); 
      engine.GetSysModule().SetVariable("argv", argv); 
      source.Execute(scope); 
     } 
    } 
} 
3

"Argumenty linii poleceń" istnieją tylko dla procesów. Jeśli uruchomisz kod w ten sposób, to skrypt Pythona najprawdopodobniej zobaczy argumenty przekazane do twojego procesu, kiedy został uruchomiony (bez kodu Pythona, trudno powiedzieć). Jak zasugerowano w komentarzach, możesz override command line arguments too.

Jeśli chcesz przekazać argumenty, niekoniecznie argumenty wiersza poleceń, istnieje kilka podejść.

Najłatwiej byłoby dodać zmienne do zdefiniowanego zakresu i odczytać te zmienne w skrypcie. Na przykład:

int variableName = 1337; 
scope.SetVariable("variableName", variableName); 

w kodzie Pythona, musisz variableName zmienną.

2

Chociaż myślę, że użycie @ Discord przy ustawianiu zmiennej zadziała, będzie wymagało zmiany sys.argv s na variableName.

Dlatego, aby odpowiedzieć na to pytanie, należy użyć engine.Sys.argv:

List<int> argv = new List<int>(); 
//Do some stuff and fill argv 
engine.Sys.argv=argv; 

Referencje:

http://www.voidspace.org.uk/ironpython/custom_executable.shtml

How can I pass command-line arguments in IronPython?

+0

Dziękujemy! Mam jedno pytanie dotyczące engine.Sys, że w moim programie dostaję komunikat o następującej treści: "Microsoft.Scripting.Hosting.ScriptEngine" nie zawiera definicji "Sys" i żadnej metody rozszerzenia "Sys" akceptującej pierwszy można znaleźć argument typu "Microsoft.Scripting.Hosting.ScriptEngine" (czy brakuje jakiejś dyrektywy lub odwołania do zestawu?) ". Jak mogę usunąć ten błąd i sprawić, by engine.Sys został rozpoznany? – GenericAlias

+0

Hmm .. Myślę, że przykład był przy użyciu instancji PythonRuntime. Będę musiał zagrzebać więcej. – IronManMark20

Powiązane problemy