मैं C # से पायथन स्क्रिप्ट कैसे चलाऊँ?


130

इस तरह का प्रश्न अलग-अलग डिग्री में पहले पूछा जा चुका है, लेकिन मुझे लगता है कि इसका उत्तर संक्षिप्त तरीके से नहीं दिया गया है और इसलिए मैं इसे फिर से पूछता हूं।

मैं पायथन में एक स्क्रिप्ट चलाना चाहता हूं। मान लीजिए कि यह है:

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

जो एक फ़ाइल स्थान प्राप्त करता है, उसे पढ़ता है, फिर उसकी सामग्री प्रिंट करता है। इतना जटिल नहीं है।

ठीक है, तो मैं इसे C # में कैसे चलाऊं?

मेरे पास अब यही है:

    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

मैं अभी कुछ समय के लिए देख रहा हूं और केवल आयरनपाइथन या इस तरह के लोगों को सुझाव दे सकता हूं। लेकिन C # से पायथन स्क्रिप्ट को कॉल करने का एक तरीका होना चाहिए।

कुछ स्पष्टीकरण:

मुझे इसे C # से चलाने की आवश्यकता है, मुझे आउटपुट कैप्चर करने की आवश्यकता है, और मैं IronPython या कुछ और का उपयोग नहीं कर सकता। आपके पास जो भी हैक होगा वह ठीक रहेगा।

पुनश्च: वास्तविक पायथन कोड जो मैं चला रहा हूं, वह इससे कहीं अधिक जटिल है, और यह आउटपुट देता है जिसकी मुझे C # में आवश्यकता है, और C # कोड लगातार पायथन कोड को कॉल करेगा।

बहाना यह मेरा कोड है:

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

1
क्या C # कोड को पायथन स्क्रिप्ट को कॉल करना है या क्या यह ठीक है (यदि आपने अंत में कहा है) तो आप केवल अजगर दुभाषिया को कॉल करते हैं जो फिर स्क्रिप्ट चलाता है?
गेराल्ड वर्स्लिस

1
क्या आपको आयरनपाइथन का उपयोग करने की अनुमति है?
यूजीन

1
@GeraldVersluis इसकी ठीक है, मुझे बस इसे c # के माध्यम से चलाने और आउटपुट को पकड़ने में सक्षम होना चाहिए।
इनबेर रोज़

जवाबों:


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
निखिल Girraj

1
पथ प्रदान करने के बिना काम करता है अगर पायथन इंस्टॉलर को पर्यावरण चर पैठ (सिस्टम या अन्य विशिष्ट) में पायथन निर्देशिका को जोड़ने के लिए कहा गया था।
मैनफ्रेड

59

यदि आप IronPython का उपयोग करने के इच्छुक हैं, तो आप सीधे C # में स्क्रिप्ट निष्पादित कर सकते हैं:

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

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

यहां आयरनपाइथन प्राप्त करें।


3
मुझे यह समझाएं, क्या मैं बिना कुछ डाउनलोड किए ऐसा कर सकता हूं? c # इस प्लगइन के साथ तैयार है? भी - क्या मैं इसके साथ बाहरी स्क्रिप्ट चला सकता हूं?
इबर रोज 14

आपको आयरनपाइथन स्थापित करना होगा, जो खुला स्रोत है। मैंने जवाब अपडेट कर दिया है।
क्रिस ड्यूनवे

7
ध्यान दें कि IronPython और Python बिलकुल एक जैसे नहीं हैं। सिर्फ रिकॉर्ड के लिए ...
रॉन क्लेन

1
IronPython भाषा सुविधाओं के उसी सेट का समर्थन नहीं करता जैसा कि Python 3.6.x करता है। इसलिए यदि आप उन भाषाओं की किसी भी सुविधा का उपयोग नहीं करते हैं तो आयरनपाइथन केवल एक विकल्प है। यह निश्चित रूप से एक कोशिश के काबिल है, हालांकि।
मैनफ्रेड

1
@ रॉनकेलिन, वे समान नहीं हैं, और यदि आप लाइब्रेरी का उपयोग करने की कोशिश कर रहे हैं जैसे कि स्किकिट-लर्न (एमएल प्रयोजनों के लिए), तो यह आपके लिए भी काम नहीं करेगा
मोहरा

28

पाइथन लिपि को C से निष्पादित करें

एक C # प्रोजेक्ट बनाएं और निम्नलिखित कोड लिखें।

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 # के कंसोल में 'पायथन सी # टेस्ट' देखेंगे ।


मेरे पास एक विंडोज़ फ़ोल्डर में एक अजगर स्क्रिप्ट फ़ाइल है जैसे C:\Users\Documents\Visual Studio 2019। फ़ोल्डर पथ में स्थान के कारण, इसे args के सीमांकक के रूप में माना जाता है, इसलिए मुझे 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);
     }
 }
}

एक उदाहरण के रूप में, cmd होगा @C:/Python26/python.exeऔर args होगा C://Python26//test.py 100यदि आप cmd लाइन तर्क 100 के साथ test.py निष्पादित करना चाहते थे। ध्यान दें कि .py फ़ाइल का पथ @ प्रतीक नहीं है।


2
क्या कोई टिप्पणी कर सकता है कि यह -1 क्यों है। इसके साथ गलत क्या है।
कीथ लफ़नेन

2
यह ठीक उसी तरह है जैसा कि आपके पैरामीटर के बजाय एक निर्दिष्ट फ़ाइलनाम के ऊपर दिए गए उत्तर से है। लेकिन अंत startमें समान मूल्य हैं
घोंसला

4

बस इस ओर आपका ध्यान आकर्षित करने के लिए:

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

यह बहुत अच्छा काम करता है।


अरे, मैं यह कोशिश की और यह ठीक काम दिखता है। लेकिन आयात मॉड्यूल में त्रुटि हो रही है। cv2 की तरह। इसका लेखन कोई मॉड्यूल जिसका नाम cv2 है मैं कैसे कर सकता है इस का समाधान यू किसी भी विचार है
İsa 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

वास्तव में आयरनप्रिथन के साथ Csharp (VS) और पायथन के बीच एकीकरण करना बहुत आसान है। यह उतना जटिल नहीं है ... जैसा कि क्रिस ड्यूनेवे ने पहले ही उत्तर अनुभाग में कहा था कि मैंने अपने स्वयं के प्रोजेक्ट के लिए इस अयोग्यता का निर्माण करना शुरू कर दिया है। एन अपने सुंदर सरल। बस इन चरणों का पालन करें एन आपको अपने परिणाम मिलेंगे।

चरण 1: वीएस खोलें और नया खाली कंसोल प्रोजेक्ट बनाएं।

चरण 2: टूल पर जाएं -> नुगेट पैकेज मैनेजर -> पैकेज मैनेजर कंसोल।

चरण 3: इसके बाद अपने ब्राउज़र में इस लिंक को खोलें और NuGet कमांड को कॉपी करें। लिंक: https://www.nuget.org/packages/IronPython/2.7.9

चरण 4: उपरोक्त लिंक को खोलने के बाद PM> इंस्टाल-पैकेज आयरनपाइथन -Version 2.7.9 कमांड को कॉपी करें और इसे VS में NuGet कंसोल में पेस्ट करें। यह सहायक पैकेज स्थापित करेगा।

चरण 5: यह मेरा कोड है जिसे मैंने अपने Python.exe निर्देशिका में संग्रहीत एक .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
}
} 

चरण 6: कोड को सहेजें और निष्पादित करें


एक डेवलपर के रूप में मैं एक समाधान नहीं चुनता क्योंकि इसे लागू करना "आसान" है। मैं एक काम करता हूं। IronPython को केवल अजगर 2.7 में पोर्ट किया गया है और अजगर 3 पर काम अब कुछ वर्षों से बिना किसी दृष्टि के समाप्त हो रहा है। आशा है कि आपका अजगर कोड सही संस्करण में है।
पीटर

27 अप्रैल 2020 तक: github.com/IronLanguages/ironpython2/releases/tag/ipy-2.7.10 , लेकिन अभी भी अजगर नहीं 3.
लुक

0

मुझे समस्या हो रही है stdin/stout- जब पेलोड का आकार कई किलोबाइट से अधिक हो जाता है तो यह लटक जाता है। मुझे न केवल कुछ छोटे तर्कों के साथ पायथन फ़ंक्शन को कॉल करने की आवश्यकता है, बल्कि एक कस्टम पेलोड के साथ जो बड़ा हो सकता है।

कुछ समय पहले, मैंने एक आभासी अभिनेता पुस्तकालय लिखा था जो रेडिस के माध्यम से विभिन्न मशीनों पर कार्य वितरित करने की अनुमति देता है। पायथन कोड को कॉल करने के लिए, मैंने पायथन से संदेशों को सुनने, उन्हें प्रोसेस करने और परिणाम वापस करने के लिए .NET में कार्यक्षमता जोड़ी। यह कैसे काम करता है इसका संक्षिप्त विवरण इस प्रकार है

यह एक मशीन पर भी काम करता है, लेकिन इसके लिए रेडिस उदाहरण की आवश्यकता होती है। Redis कुछ विश्वसनीयता की गारंटी देता है - पेलोड को तब तक संग्रहीत किया जाता है जब तक एक काम पूरा नहीं हो जाता। यदि एक काम किया जाता है, तो पेलोड को नौकरी की कतार में लौटा दिया जाता है और फिर दूसरे कर्मचारी द्वारा पुन: भुगतान किया जाता है।


आप सिर्फ इन-आउट फ़ाइलों का उपयोग क्यों नहीं करेंगे? पाइप के बजाय उस काम के सभी संभाल।
इबार रोज

@ InbarRose मेरे पास पहले से ही .NET के लिए सिस्टम था, इसलिए पायथन प्रोसेसिंग को जोड़ना बहुत आसान था और मेरे पास अभी भी वितरण और विश्वसनीयता है - जैसे मैं विंडोज मशीन से पेलोड पोस्ट कर सकता हूं और इसे लिनक्स मशीन से प्रोसेस कर सकता हूं - फाइलें इसमें काम नहीं करेंगी मामला।
वीबी

@InbarRose और जब पेलोड वास्तव में बड़ा होता है, तो मैं उसी मशीन पर फ़ाइल नाम या AWS पर S3 संदर्भ इत्यादि पास कर सकता था ...
VB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.