2015-05-21 11 views
8

ho il seguente codice C# in cui io chiamo uno script python da C#:Come faccio a passare argomenti per uno script Python con 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); 
     } 
    } 
} 

Sto avendo difficoltà a capire ogni riga di codice perché la mia esperienza con C# è limitato. Come modifico questo codice per passare un argomento da linea di comando al mio script python quando lo eseguo?

+0

Eventuali duplicati di https://stackoverflow.com/questions/5949735/how-can-i-pass-command-line-arguments- in-ironpython – IronManMark20

risposta

5

Grazie a tutti per avermi nella direzione corretta. Per qualche motivo engine.sys sembra non funzionare più per le versioni più recenti di IronPython, quindi è necessario utilizzare GetSysModule. Ecco la versione rivista del mio codice che mi permette di modificare 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

"Argomenti della riga di comando" esiste solo per i processi. Se si esegue il codice in questo modo, lo script python molto probabilmente vedrà gli argomenti passati al processo quando è stato avviato (senza codice Python, è difficile dirlo). Come suggerito nei commenti, è possibile override command line arguments too.

Se ciò che si vuole fare è passare argomenti, non necessariamente argomenti a riga di comando, allora ci sono diversi approcci.

Il più semplice sarebbe aggiungere le variabili all'ambito definito e leggere queste variabili nello script. Per esempio:

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

Nel codice python, avrai variableName variabile.

2

Mentre penso che l'uso di @ Discord di impostare una variabile possa funzionare, richiederebbe una modifica di sys.argv s a variableName.

Quindi, per rispondere alla domanda, è necessario utilizzare engine.Sys.argv:

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

Riferimenti:

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

How can I pass command-line arguments in IronPython?

+0

Grazie! Una domanda che ho per quanto riguarda engine.Sys è che nel mio programma ottengo un messaggio che afferma quanto segue: "'Microsoft.Scripting.Hosting.ScriptEngine' non contiene una definizione per 'Sys' e nessun metodo di estensione 'Sys' accetta una prima argomento di tipo 'Microsoft.Scripting.Hosting.ScriptEngine' potrebbe essere trovato (ti manca un riferimento using direttiva o assembly?) ". Come ottengo questo errore di andare via e ottenere engine.Sys per essere riconosciuto? – GenericAlias

+0

Hmm .. Penso che l'esempio stia usando un'istanza PythonRuntime. Avrò bisogno di dare un'occhiata di più. – IronManMark20

Problemi correlati