আমি সি # থেকে পাইথন স্ক্রিপ্ট কীভাবে চালাব?


130

বিভিন্ন ধরণের ডিগ্রি আগে এই ধরণের প্রশ্ন জিজ্ঞাসা করা হয়েছিল, তবে আমি মনে করি এটি সংক্ষিপ্তভাবে উত্তর দেওয়া হয়নি এবং তাই আমি আবার এটি জিজ্ঞাসা করি।

আমি পাইথনে স্ক্রিপ্ট চালাতে চাই। আসুন বলি এটি এটি:

if __name__ == '__main__':
    with open(sys.argv[1], 'r') as f:
        s = f.read()
    print s

যা একটি ফাইলের অবস্থান পায়, এটি পড়ে, তার সামগ্রীগুলি মুদ্রণ করে। এত জটিল নয়।

ঠিক আছে, তো আমি কীভাবে এটি সি # তে চালাব?

আমার এখন যা আছে:

    private void run_cmd(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = cmd;
        start.Arguments = args;
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string result = reader.ReadToEnd();
                Console.Write(result);
            }
        }
    }

যখন আমি code.pyঅবস্থানটি cmdএবং filenameঅবস্থানটি যেমন argsকাজ করে না তখন পাস করি । আমাকে বলা হয়েছে আমি পাস করা উচিত python.exeহিসাবে cmd, এবং তারপর code.py filenameহিসাবে args

আমি এখন কিছুক্ষণ সন্ধান করেছি এবং কেবলমাত্র লোকে পাইথন বা এ জাতীয় ব্যবহার করার পরামর্শ দিচ্ছে এমন লোককে দেখতে পাচ্ছি। তবে সি # থেকে পাইথন স্ক্রিপ্ট কল করার একটি উপায় থাকতে হবে।

কিছু স্পষ্টতা:

আমার এটি সি # থেকে চালানো দরকার, আমার আউটপুট ক্যাপচার করতে হবে এবং আমি আয়রন পাইথন বা অন্য কিছু ব্যবহার করতে পারি না। আপনার যা কিছু হ্যাক ঠিক আছে।

পিএস: আমি যে প্রকৃত পাইথন কোডটি চালাচ্ছি এটি এর চেয়ে অনেক বেশি জটিল এবং এটি সি # তে আমার যা প্রয়োজন তা আউটপুট দেয় এবং সি # কোড অবিরাম পাইথন কোডটি কল করবে।

এটি আমার কোড ভান করুন:

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }

1
সি # কোডটিতে কি পাইথন স্ক্রিপ্ট কল করতে হবে বা ঠিক আছে (যদি আপনি শেষে বলেছিলেন) আপনি কেবল অজগর দোভাষীকে কল করেন যা স্ক্রিপ্টটি চালায়?
জেরাল্ড ভার্স্লুইস

1
আপনি কি আয়রন পাইথন ব্যবহারের অনুমতি দিচ্ছেন?
ইউজিন

1
@ জেরাল্ডভেরলুস্লু ঠিক আছে, আমার কেবল এটি সি # এর মাধ্যমে চালানো এবং আউটপুট ধরতে সক্ষম হতে হবে।
ইনবার রোজ

উত্তর:


123

এটি কাজ না করার কারণটি আপনার UseShellExecute = false

আপনি যদি শেলটি ব্যবহার না করেন তবে আপনাকে অজগরকে এক্সিকিউটেবলের জন্য সম্পূর্ণ পথ সরবরাহ করতে হবে FileNameএবং Argumentsআপনার স্ক্রিপ্ট এবং আপনি যে ফাইলটি পড়তে চান উভয়ই সরবরাহ করতে স্ট্রিংটি তৈরি করতে হবে।

এছাড়াও মনে রাখবেন, আপনি না করতে পারলে RedirectStandardOutputনা UseShellExecute = false

অজগরটির জন্য আর্গুমেন্ট স্ট্রিংটি কীভাবে ফর্ম্যাট করা উচিত তা আমি নিশ্চিত নই, তবে আপনার এর মতো কিছু প্রয়োজন হবে:

private void run_cmd(string cmd, string args)
{
     ProcessStartInfo start = new ProcessStartInfo();
     start.FileName = "my/full/path/to/python.exe";
     start.Arguments = string.Format("{0} {1}", cmd, args);
     start.UseShellExecute = false;
     start.RedirectStandardOutput = true;
     using(Process process = Process.Start(start))
     {
         using(StreamReader reader = process.StandardOutput)
         {
             string result = reader.ReadToEnd();
             Console.Write(result);
         }
     }
}

আমি পরে ব্যবহার করার জন্য আমার প্রোগ্রামে আউটপুট নিতে সক্ষম হতে চাই। সুতরাং আমার শেল্লেক্সিকিটটি মিথ্যা হিসাবে হওয়া দরকার। আপনি বলছেন আমি যদি পাস c:\python26\python.exeহিসাবে cmdএবং তারপর c:\temp\code.py c:\temp\testfile.txtহিসাবে argsএটি কাজ করা উচিত?
ইনবার রোজ

আমি একটি দ্রুত উদাহরণ দিয়ে আপডেট করেছি, নোডের সাথে আমি যখন অনুরূপ কিছু করেছি তখন আমি একই ইস্যুতে ছুটলাম
মাস্টার নৈতিকতা

ঠিক আছে, এটা এখন আমার জন্য কাজ করে। সমস্যাটি হ'ল আপনার খুব সাবধানে স্ট্রিংগুলি ফরম্যাট করতে হবে। "PATH"জায়গা না থাকলেও যে কোনও পাথের প্রয়োজন ... অদ্ভুত ...
ইনবার রোজ

আমার পুরো পথ সরবরাহ না করেই কাজ করে। আমি সেটিং করছি UseShellExecuteকরার falseএবং RedirectStandardOutputকরতে true
নিখিল গিররাজ

1
পাইথন ইনস্টলারকে পরিবেশ পরিবর্তনশীল PATH (সিস্টেম বা ব্যবহারকারী নির্দিষ্ট) এর সাথে পাইথন ডিরেক্টরি যুক্ত করতে বলা হলে পথ সরবরাহ ছাড়াই কাজ করে।
ম্যানফ্রেড

59

আপনি যদি আয়রন পাইথন ব্যবহার করতে ইচ্ছুক হন তবে আপনি সরাসরি সি # তে স্ক্রিপ্টগুলি সম্পাদন করতে পারেন:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

private static void doPython()
{
    ScriptEngine engine = Python.CreateEngine();
    engine.ExecuteFile(@"test.py");
}

এখানে আয়রন পাইথন পান।


3
আমাকে এই ব্যাখ্যা করুন, আমি কিছু ডাউনলোড না করে এটি করতে পারি? সি # এই প্লাগইন দিয়ে প্রস্তুত? এছাড়াও - আমি কি এটি দিয়ে বাহ্যিক স্ক্রিপ্টগুলি চালাতে পারি?
ইনবার রোজ

আপনাকে আয়রনপাইথন ইনস্টল করতে হবে যা ওপেন সোর্স। আমি উত্তর আপডেট করেছি।
ক্রিস ডুনাওয়ে

7
লক্ষ করুন যে আয়রন পাইথন এবং পাইথন হুবহু এক জিনিস নয়। কেবল রেকর্ডের জন্য ...
রন ক্লেইন

1
আয়রন পাইথন পাইথন ৩.6.x এর মতো ভাষা বৈশিষ্ট্যগুলির একই সেটকে সমর্থন করে বলে মনে হয় না। সুতরাং আপনি যদি সেই ভাষার কোনও বৈশিষ্ট্য ব্যবহার না করেন তবে আয়রন পাইথন কেবলমাত্র একটি বিকল্প। যদিও এটি অবশ্যই চেষ্টা করার মতো।
মানফ্রেড

1
@ রনক্লেইন, এগুলি এক নয় এবং আপনি যদি বিজ্ঞান-শিখার (এমএল উদ্দেশ্যে) কোনও লাইব্রেরি ব্যবহার করার চেষ্টা করছেন তবে এটি আপনার পক্ষেও কার্যকর হবে না
মোয়ারার

28

সি থেকে পাইথন স্ক্রিপ্ট কার্যকর করুন

একটি সি # প্রকল্প তৈরি করুন এবং নিম্নলিখিত কোডটি লিখুন।

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            run_cmd();
        }

        private void run_cmd()
        {

            string fileName = @"C:\sample_script.py";

            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName)
            {
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };
            p.Start();

            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            Console.WriteLine(output);

            Console.ReadLine();

        }
    }
}

পাইথন নমুনা_স্ক্রিপ্ট

"পাইথন সি # পরীক্ষা" মুদ্রণ করুন

আপনি সি # এর কনসোলে 'পাইথন সি # টেস্ট' দেখতে পাবেন ।


আমার মতো উইন্ডোজ ফোল্ডারে পাইথন স্ক্রিপ্ট ফাইল রয়েছে C:\Users\Documents\Visual Studio 2019। ফোল্ডারের পাথের জায়গার কারণে এটি আরগ্সের ডিলিমিটার হিসাবে বিবেচিত হয়, তাই আমি পেয়েছি যে fileNameএটি পাওয়া যাবে না। স্থান থেকে বাঁচার কোনও উপায় আছে?
লিওন চ্যাং

15

আমি একই সমস্যায় পড়েছি এবং মাস্টার নৈতিকতার উত্তর আমার পক্ষে তা করেনি। নিম্নলিখিত, যা পূর্ববর্তী উত্তরের উপর ভিত্তি করে কাজ করেছে:

private void run_cmd(string cmd, string args)
{
 ProcessStartInfo start = new ProcessStartInfo();
 start.FileName = cmd;//cmd is full path to python.exe
 start.Arguments = args;//args is path to .py file and any cmd line args
 start.UseShellExecute = false;
 start.RedirectStandardOutput = true;
 using(Process process = Process.Start(start))
 {
     using(StreamReader reader = process.StandardOutput)
     {
         string result = reader.ReadToEnd();
         Console.Write(result);
     }
 }
}

উদাহরণস্বরূপ, সেন্টিমিডিটি হবে @C:/Python26/python.exeএবং C://Python26//test.py 100আপনি যদি সেমিডি লাইন আর্গুমেন্ট 100 দিয়ে টেস্ট.পিসি কার্যকর করতে চান তবে আর্গুমেন্টগুলি হতে পারে। নোট করুন যে .py ফাইলটিতে যে পথটি নেই তার @ চিহ্ন রয়েছে।


2
এটি -1 কেন কেউ মন্তব্য করতে পারে। এতে কী দোষ আছে।
কিথ লোগেনে

2
পরিবর্তে প্যারামিটার থেকে কেবল আপনার ফাইলনাম নির্ধারণের উপরে এটির উত্তরের মতোই। কিন্তু শেষে startএকই মান আছে
নীড়

4

আপনার দৃষ্টি আকর্ষণ করার জন্য কেবল এটি:

https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee

এটি দুর্দান্ত কাজ করে।


আরে, this এটি চেষ্টা করে দেখে মনে হচ্ছে এটি ঠিক আছে। তবে আমদানি মডিউলগুলিতে ত্রুটি হচ্ছে। সিভি 2 এর মতো এর লেখার কোনও সিডি 2 নামক কোনও মডিউল নেই। কীভাবে এটি সমাধান করতে পারে আপনার কোনও ধারণা আছে
İসা GİRİŞKEN

3
এই লিঙ্কটি এখন বিষয়গুলির তালিকায় পুনঃনির্দেশ করে। পাইথনের একটি মাত্র উল্লেখ করেছেন এবং এটি খুব প্রাসঙ্গিক নয়।
গ্রেগ ভোগেল

3

ওয়ার্কিংডাইরেক্টরি সেট করুন বা আর্গুমেন্টে পাইথন স্ক্রিপ্টের পুরো পথ নির্দিষ্ট করুন

ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "C:\\Python27\\python.exe";
//start.WorkingDirectory = @"D:\script";
start.Arguments = string.Format("D:\\script\\test.py -a {0} -b {1} ", "some param", "some other param");
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
    using (StreamReader reader = process.StandardOutput)
    {
        string result = reader.ReadToEnd();
        Console.Write(result);
    }
}

3

বাস্তবে আয়রন পাইথনের সাথে সিজার্প (ভিএস) এবং পাইথনের মধ্যে সংহতকরণ করা বেশ সহজ। এটি এতটা জটিল নয় ... ক্রিস ডুনাওয়ে ইতিমধ্যে উত্তর বিভাগে বলেছিলেন যে আমি নিজের প্রকল্পের জন্য এই অচলতা তৈরি করতে শুরু করেছি। এন এটি খুব সহজ। এই পদক্ষেপগুলি অনুসরণ করুন N আপনি নিজের ফলাফল পাবেন get

পদক্ষেপ 1: ভিএস খুলুন এবং নতুন খালি কনসোল অ্যাপ্লিকেশন তৈরি করুন।

পদক্ষেপ 2: সরঞ্জামগুলিতে যান -> নিউগেট প্যাকেজ ম্যানেজার -> প্যাকেজ ম্যানেজার কনসোল।

পদক্ষেপ 3: এর পরে আপনার ব্রাউজারে এই লিঙ্কটি খুলুন এবং নিউগেট কমান্ডটি অনুলিপি করুন। লিঙ্ক: https://www.nuget.org/packages/IronPython/2.7.9

পদক্ষেপ 4: উপরের লিঙ্কটি খোলার পরে প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ আইরন পাইথন-সংস্করণ 2.7.9 কমান্ডটি কপি করুন এবং এটি ভিএস-এর নুগেট কনসোলে পেস্ট করুন এটি সহায়ক প্যাকেজ ইনস্টল করবে।

পদক্ষেপ 5: এটি আমার কোড যা আমি পাইথন.এক্সই ডিরেক্টরিতে একটি .py ফাইল চালাতে ব্যবহার করেছি।

using IronPython.Hosting;//for DLHE
using Microsoft.Scripting.Hosting;//provides scripting abilities comparable to batch files
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
class Hi
{
private static void Main(string []args)
{
Process process = new Process(); //to make a process call
ScriptEngine engine = Python.CreateEngine(); //For Engine to initiate the script
engine.ExecuteFile(@"C:\Users\daulmalik\AppData\Local\Programs\Python\Python37\p1.py");//Path of my .py file that I would like to see running in console after running my .cs file from VS.//process.StandardInput.Flush();
process.StandardInput.Close();//to close
process.WaitForExit();//to hold the process i.e. cmd screen as output
}
} 

পদক্ষেপ:: কোডটি সংরক্ষণ করুন এবং সম্পাদন করুন


বিকাশকারী হিসাবে আমি কোনও সমাধান বেছে নিই না কারণ এটি প্রয়োগ করা "সহজ"। আমি কাজ করি এমন একটি বাছাই করি। আয়রন পাইথনটি কেবল পাইথন ২.7 এ পোর্ট করা হয়েছে এবং অজগর 3 এ কাজ করা বেশ কয়েক বছর ধরে চলবে, দৃষ্টিতে শেষ না হয়ে। আশা করি আপনার অজগর কোডটি সঠিক সংস্করণে রয়েছে।
পিটার.সেক

27 এপ্রিল 2020 অনুসারে: github.com/IronLanguages/ironpython2/releases/tag/ipy-2.7.10 , কিন্তু এখনও অজগর 3 নয়
লুউক

0

আমার সাথে সমস্যা হচ্ছে stdin/stout- যখন পে-লোডের আকারটি বেশ কয়েকটি কিলোবাইটের চেয়ে বেশি হয় তখন এটি স্তব্ধ হয়ে যায়। আমার পাইথন ফাংশনগুলিকে কেবল কয়েকটি সংক্ষিপ্ত যুক্তি দিয়ে নয়, তবে একটি কাস্টম পেওলডও কল করতে হবে যা বড় হতে পারে।

কিছুক্ষণ আগে, আমি একটি ভার্চুয়াল অভিনেতা গ্রন্থাগার লিখেছিলাম যা রেডিসের মাধ্যমে বিভিন্ন মেশিনে টাস্ক বিতরণ করতে দেয়। পাইথন কোডটি কল করতে, আমি পাইথন থেকে বার্তা শোনার জন্য কার্যকারিতা যুক্ত করেছি, সেগুলি প্রক্রিয়া করি এবং ফলাফলগুলি .NET এ ফিরে আসি। এটি কীভাবে কাজ করে তার একটি সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল

এটি একটি একক মেশিনেও কাজ করে তবে এটি একটি রেডিস উদাহরণ প্রয়োজন। রেডিস কিছু নির্ভরযোগ্যতা গ্যারান্টি যুক্ত করেছে - কোনও কাজের পরিপূর্ণতা স্বীকৃতি না দেওয়া পর্যন্ত পে-লোড সংরক্ষণ করা হয়। যদি একটি কাজ মারা যায়, পে-লোডটি একটি কাজের কাতারে ফিরে আসে এবং তারপরে অন্য কর্মী দ্বারা পুনরায় প্রসেস করা হয়।


আপনি কেবল ইন-আউট ফাইলগুলি ব্যবহার করবেন না কেন? পাইপ থাকার পরিবর্তে সেই সমস্ত কাজ পরিচালনা করে।
ইনবার রোজ

@ ইন্বাররোজ আমার কাছে ইতিমধ্যে .NET এর জন্য সিস্টেম ছিল, তাই পাইথন প্রসেসিং যুক্ত করা খুব সহজ ছিল এবং আমার এখনও বিতরণ এবং নির্ভরযোগ্যতা রয়েছে - যেমন আমি উইন্ডোজ মেশিন থেকে পেডলোড পোস্ট করতে এবং লিনাক্স মেশিন থেকে এটি প্রক্রিয়া করতে পারতাম - ফাইলগুলি এতে কাজ করবে না কেস।
ভিবি

@ ইন্নবররোজ এবং যখন পেডলোডটি সত্যিই বড় হয়, আমি একই মেশিনে ফাইল নাম বা এডাব্লুএস ইত্যাদির এস 3 রেফারেন্সটি পাস করতে পারি ...
ভিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.