2016-02-17 22 views
7

Tôi có Visual Studio 2015 với biểu mẫu chính được viết bằng C# và từ đó tôi có các lớp khác nhau được viết bằng Python (Python bình thường không phải là Python Python). Làm cách nào để gọi hàm Python từ mã C# của tôi?Gọi hàm Python từ C# (.NET)

Tôi biết có nhiều chủ đề về vấn đề này nhưng hầu hết chúng quá cũ và một số giải pháp quá khó hoặc liên quan đến việc sử dụng ngôn ngữ trung gian như C++.

Dưới đây là một số liên kết tôi thấy hữu ích nhưng không cung cấp câu trả lời tôi đã tìm kiếm chính xác:

Có một cách dễ dàng cách nào hay tôi vẫn cần giải pháp? Và nếu tôi cần một cách giải quyết thì cách dễ nhất là gì?

+0

Bạn đã nhìn pythonnet? – denfromufa

Trả lời

3

Bạn có thể gọi tất cả mọi thứ thông qua dòng lệnh của bạn

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "python whatever"; 
process.StartInfo = startInfo; 
process.Start(); 

Hoặc thậm chí tốt hơn, chỉ cần gọi Python.exe và vượt qua py tập tin của bạn như là đối số của nó:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "Python.exe"; 
startInfo.Arguments = "yourfile.py"; 
process.StartInfo = startInfo; 
process.Start(); 
+0

Tôi nghĩ OP đang tìm kiếm một giải pháp để gọi một chức năng cụ thể thay vì chỉ thực hiện kịch bản –

+2

@AlexanderMiles quá trình này vẫn như cũ. Bạn có thể gọi 'python -c 'import foo; in lệnh foo.hello() ''thông qua' System.Diagnostics.Process' – Yar

+2

Có một bài viết hay được viết năm 2015 sử dụng phương pháp tiếp cận thứ hai của @ Yar tại https://code.msdn.microsoft.com/windowsdesktop/C-and- Python-interprocess-171378ee. Nó cũng bao gồm việc gửi các đối số kịch bản lệnh Python của bạn và thu giữ đầu ra của nó trong ứng dụng C# của bạn. – snark

-2

Cách được khuyến nghị để thực hiện việc này là sử dụng IronPython. Có một câu trả lời khác đi qua các khái niệm cơ bản khi sử dụng IronPython để truy cập mã Python từ C#: How do I call a specific Method from a Python Script in C#?

Nếu IronPython không phải là lựa chọn, bạn có thể chạy hàm từ dòng lệnh và truyền vào lập luận khi cần thiết, mặc dù cho bất cứ điều gì phức tạp này có thể biến thành spaghetti. Dưới đây là một ví dụ cơ bản của chạy một hàm trăn trong một mô-đun trực tiếp từ dòng lệnh:

python -c 'import foo; print foo.hello()' 

Vì vậy, để chạy trên trong C#:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "python.exe"; 
startInfo.Arguments = "-c import foo; print foo.hello()"; 
process.StartInfo = startInfo; 
process.Start(); 

Lưu ý rằng nếu bạn đang cố gắng để có được một trở lại giá trị trở lại, trong trường hợp này bạn sẽ phải in dữ liệu vào giao diện điều khiển và sau đó serialize đầu ra từ C# như bạn thấy phù hợp. Điều này có thể có khả năng có vấn đề nếu chức năng xuất ra bất cứ điều gì để bàn điều khiển trên riêng của nó, trừ khi bạn lọc nó ra hoặc có một tùy chọn để đàn áp đầu ra từ chức năng đó.

+2

lol cảm ơn vì đã sao chép câu trả lời của tôi. – Yar

+0

Tôi đã thêm điều này vào lúc bạn trả lời, mặc dù tôi thừa nhận rằng tôi đã nhận được một ghi chú từ bạn về việc thiết lập WindowStyle –

+0

Tại sao các downvotes? –