2015-05-21 13 views
8

Tôi có đoạn mã sau C# mà tôi gọi là một kịch bản python từ C#:Làm thế nào để vượt qua đối số cho một kịch bản Python với 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); 
     } 
    } 
} 

Tôi đang gặp rắc rối hiểu mỗi dòng của mã vì kinh nghiệm của tôi với C# bị giới hạn. Làm thế nào tôi sẽ thay đổi mã này để vượt qua một đối số dòng lệnh để kịch bản python của tôi khi tôi chạy nó?

+0

Có thể trùng lặp của https://stackoverflow.com/questions/5949735/how-can-i-pass-command-line-arguments- in-ironpython – IronManMark20

Trả lời

5

Cảm ơn tất cả các bạn đã chỉ cho tôi theo hướng đúng. Đối với một số lý do engine.sys dường như không còn làm việc cho các phiên bản mới hơn của IronPython vì vậy thay vì GetSysModule phải được sử dụng. Đây là phiên bản sửa đổi của mã của tôi cho phép tôi thay đổi 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

"Đối số dòng lệnh" chỉ tồn tại cho các quy trình. Nếu bạn chạy mã theo cách này, bạn python script rất có thể sẽ thấy các đối số được truyền cho quá trình của bạn khi nó được bắt đầu (không có mã Python, thật khó để nói). Như được đề xuất trong các ý kiến, bạn có thể override command line arguments too.

Nếu những gì bạn muốn làm là chuyển đối số, không nhất thiết phải đối số dòng lệnh, thì có một số cách tiếp cận.

Cách dễ nhất là thêm biến vào phạm vi bạn đã xác định và đọc các biến này trong tập lệnh. Ví dụ:

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

Trong mã python, bạn sẽ có biến số variableName.

2

Mặc dù tôi cho rằng việc sử dụng đặt sai biến của @ Discord sẽ hoạt động, nó sẽ yêu cầu thay đổi sys.argv s thành variableName.

Vì vậy, để trả lời câu hỏi, bạn nên sử dụng engine.Sys.argv:

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

Tài liệu tham khảo:

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

How can I pass command-line arguments in IronPython?

+0

Cảm ơn bạn! Một câu hỏi tôi có liên quan đến engine.Sys là trong chương trình của tôi, tôi nhận được một thông báo ghi rõ những điều sau đây: "'Microsoft.Scripting.Hosting.ScriptEngine' không chứa định nghĩa cho 'Sys' và không có phương pháp mở rộng 'Sys' chấp nhận đối số của loại 'Microsoft.Scripting.Hosting.ScriptEngine' có thể được tìm thấy (bạn đang thiếu một chỉ thị bằng cách sử dụng hoặc tham chiếu lắp ráp?) ". Làm thế nào để tôi nhận được lỗi này để biến mất và nhận được engine.Sys để được công nhận? – GenericAlias

+0

Hmm .. Tôi nghĩ ví dụ này đang sử dụng một cá thể PythonRuntime. Tôi sẽ cần phải poke xung quanh nhiều hơn nữa. – IronManMark20

Các vấn đề liên quan