سؤال

لدي محرك برمجة نصية مضمن في تطبيق C# الخاص بي يستخدم IronPython 2.أقوم بإنشاء وقت تشغيل Python وأضف بعض الفئات إلى مساحة الاسم العامة حتى يتمكن البرنامج النصي من استيرادها كوحدات نمطية.

ومع ذلك، هناك شيء واحد (أساسي جدًا) لا يمكنني اكتشافه وهو كيفية إرسال وسيطات البرنامج النصي.أدرك أنه يمكنني فقط إنشاء متغير بقائمة من الوسائط، ولكن يجب أن تكون هناك طريقة مناسبة للقيام بذلك.كما أن القيام بذلك بطريقة "Python" المناسبة يسمح لي بتجميع البرامج النصية واستخدام أداة إنشاء المستندات الآلية التي تسمى Sphinx.لذا فإن الهدف النهائي هو أن تكون قادرًا على استخدام:

import sys
sys.argv

في أحد البرامج النصية الخاصة بي واطلب منه الحصول على الوسائط التي حددها المستخدم (من خلال تطبيق C#).

الآن، أقوم باستدعاء البرنامج النصي باستخدام:

// set up iron python runtime engine
_engine = Python.CreateEngine();
_runtime = _engine.Runtime;
_scope = _engine.CreateScope();

// run script
_script = _engine.CreateScriptSourceFromFile(_path);
_script.Execute(_scope);

ولقد حاولت البحث عن واجهة برمجة التطبيقات (API) لإضافة وسيطات البرنامج النصي دون جدوى.لقد حاولت أيضًا إلحاقهم بمسار البرنامج النصي (_path على سبيل المثال) دون جدوى.لقد حاولت باستخدام CreateScriptSourceFrom File وCreateScriptSourceFromSting (والتي كانت لقطة طويلة على أي حال...).

هل ما أحاول فعله ممكن؟

هل كانت مفيدة؟

المحلول

عند إنشاء محرك، يمكنك إضافة خيار "الحجج" ويحتوي على حججك:

IDictionary<string, object> options = new Dictionary<string, object>();
options["Arguments"] = new [] { "foo", "bar" };
_engine = Python.CreateEngine(options);

والآن سوف تحتوي sys.argv ["foo", "bar"].

ويمكنك ضبط options["Arguments"] إلى أي شيء التي تطبق ICollection<string>.

نصائح أخرى

سيقوم sys.argv في النهاية بإرجاع المعلمات الفعلية التي تم تمريرها إلى تطبيق الاستضافة.إليك بعض الطرق لحل هذه المشكلة:

  1. أعد كتابة البرنامج النصي الخاص بك لقبول المتغيرات العامة، ثم استخدم ScriptScope.SetVariable
  2. قم بتشغيل البرنامج النصي، ولكن اعتمد عليه لإرجاع فصل دراسي إليك، والذي يمكنك استدعاء الأساليب عليه (أسهل كثيرًا في الإصدار 4.0 باستخدام الكلمة الأساسية الديناميكية)
  3. تجاوز sys.argv باستخدام تطبيقك الخاص (هذه لغة ديناميكية على كل حال!)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top