Pertanyaan semacam ini telah diajukan sebelumnya dalam berbagai tingkat, tetapi saya merasa itu belum dijawab secara ringkas sehingga saya bertanya lagi.
Saya ingin menjalankan skrip dengan Python. Katakanlah ini:
if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
s = f.read()
print s
Yang mendapat lokasi file, membacanya, lalu mencetak isinya. Tidak terlalu rumit.
Oke, jadi bagaimana cara menjalankan ini di C #?
Inilah yang saya miliki sekarang:
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);
}
}
}
Ketika saya melewati code.py
lokasi sebagai cmd
dan filename
lokasi karena args
tidak berfungsi. Saya diberitahu bahwa saya harus lulus python.exe
sebagai cmd
, dan kemudian code.py filename
sebagai args
.
Saya telah mencari beberapa saat sekarang dan hanya dapat menemukan orang yang menyarankan untuk menggunakan IronPython atau semacamnya. Tetapi harus ada cara untuk memanggil skrip Python dari C #.
Beberapa klarifikasi:
Saya perlu menjalankannya dari C #, saya perlu menangkap output, dan saya tidak bisa menggunakan IronPython atau apa pun. Apapun hack yang Anda miliki akan baik-baik saja.
PS: Kode Python aktual yang saya jalankan jauh lebih kompleks dari ini, dan mengembalikan keluaran yang saya butuhkan di C #, dan kode C # akan terus-menerus memanggil kode Python.
Berpura-puralah ini kode saya:
private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
sumber
Jawaban:
Alasan mengapa hal itu tidak berhasil adalah karena Anda memilikinya
UseShellExecute = false
.Jika Anda tidak menggunakan shell, Anda harus menyediakan path lengkap ke python executable as
FileName
, dan membangunArguments
string untuk memasok skrip dan file yang ingin Anda baca.Perhatikan juga, bahwa Anda tidak bisa
RedirectStandardOutput
kecualiUseShellExecute = false
.Saya tidak yakin bagaimana string argumen harus diformat untuk python, tetapi Anda akan membutuhkan sesuatu seperti ini:
sumber
c:\python26\python.exe
sebagaicmd
dan kemudianc:\temp\code.py c:\temp\testfile.txt
sebagaimanaargs
mestinya bekerja?"PATH"
walaupun tidak ada spasi ... aneh ...UseShellExecute
kefalse
danRedirectStandardOutput
ketrue
.Jika Anda ingin menggunakan IronPython, Anda dapat menjalankan skrip langsung di C #:
Dapatkan IronPython di sini.
sumber
Jalankan skrip Python dari C
Buat proyek C # dan tulis kode berikut.
Python sample_script
Anda akan melihat 'Python C # Test' di konsol C #.
sumber
C:\Users\Documents\Visual Studio 2019
. Karena ruang di path folder, itu diperlakukan sebagai pembatas args, jadi saya mendapatkanfileName
tidak dapat ditemukan. Apakah ada cara untuk keluar dari ruang?Saya mengalami masalah yang sama dan jawaban Guru Moralitas tidak melakukannya untuk saya. Berikut ini, yang didasarkan pada jawaban sebelumnya, berfungsi:
Sebagai contoh, cmd akan menjadi
@C:/Python26/python.exe
dan args akanC://Python26//test.py 100
jika Anda ingin menjalankan test.py dengan argumen garis cmd 100. Perhatikan bahwa path file .py tidak memiliki simbol @.sumber
start
memiliki nilai yang samaHanya juga untuk menarik perhatian Anda pada ini:
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
Ini bekerja dengan baik.
sumber
Atur WorkingDirectory atau tentukan path lengkap skrip python di Argument
sumber
Sebenarnya cukup mudah untuk melakukan integrasi antara Csharp (VS) dan Python dengan IronPython. Ini tidak terlalu rumit ... Seperti yang sudah dikatakan Chris Dunaway di bagian jawaban, saya mulai membangun inegrasi ini untuk proyek saya sendiri. Cukup sederhana. Cukup ikuti langkah-langkah ini N Anda akan mendapatkan hasil Anda.
langkah 1: Buka VS dan buat proyek ConsoleApp kosong yang baru.
langkah 2: Buka alat -> NuGet Package Manager -> Package Manager Console.
langkah 3: Setelah ini buka tautan ini di browser Anda dan salin NuGet Command. Tautan: https://www.nuget.org/packages/IronPython/2.7.9
langkah 4: Setelah membuka tautan di atas, salin perintah PM> Install-Package IronPython -Version 2.7.9 dan tempel di NuGet Console di VS. Ini akan menginstal paket yang mendukung.
langkah 5: Ini adalah kode saya yang telah saya gunakan untuk menjalankan file .py yang disimpan di direktori Python.exe saya.
langkah 6: simpan dan jalankan kode
sumber
Saya mengalami masalah dengan
stdin/stout
- ketika ukuran muatan melebihi beberapa kilobyte itu hang. Saya perlu memanggil fungsi Python tidak hanya dengan beberapa argumen pendek, tetapi dengan payload kustom yang bisa jadi besar.Beberapa waktu yang lalu, saya menulis perpustakaan aktor virtual yang memungkinkan untuk mendistribusikan tugas pada mesin yang berbeda melalui Redis. Untuk memanggil kode Python, saya menambahkan fungsionalitas untuk mendengarkan pesan dari Python, memprosesnya dan mengembalikan hasilnya ke .NET. Berikut ini adalah deskripsi singkat tentang cara kerjanya .
Ini bekerja pada satu mesin juga, tetapi membutuhkan contoh Redis. Redis menambahkan beberapa jaminan keandalan - muatan disimpan sampai karya berhasil diselesaikan. Jika seorang pekerja meninggal, payload dikembalikan ke antrian pekerjaan dan kemudian diproses kembali oleh pekerja lain.
sumber