이런 종류의 질문은 이전에 다양한 수준으로 요청되었지만 간결한 방식으로 답변되지 않은 것 같아서 다시 묻습니다.
파이썬에서 스크립트를 실행하고 싶습니다. 이것이 이것이라고 가정 해 봅시다.
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
위치를 전달하면 내가 통과해야 들었다 는 AS 후, 은 AS .cmd
filename
args
python.exe
cmd
code.py filename
args
나는 잠시 동안 찾고 있었고 IronPython 등을 사용하도록 제안하는 사람들 만 찾을 수 있습니다. 그러나 C #에서 Python 스크립트를 호출하는 방법이 있어야합니다.
몇 가지 설명 :
C #에서 실행해야하고 출력을 캡처해야하며 IronPython 또는 다른 것을 사용할 수 없습니다. 해킹이 무엇이든 괜찮을 것입니다.
추신 : 내가 실행중인 실제 Python 코드는 이것보다 훨씬 복잡하며 C #에서 필요한 출력을 반환하며 C # 코드는 지속적으로 Python 코드를 호출합니다.
이것이 내 코드 인 척 :
private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
답변
작동하지 않는 이유는 귀하가 있기 때문 UseShellExecute = false
입니다.
셸을 사용하지 않으면 python 실행 파일의 전체 경로를 로 제공하고 스크립트와 읽을 파일을 모두 제공 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);
}
}
}
답변
IronPython을 사용하려는 경우 C #에서 직접 스크립트를 실행할 수 있습니다.
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
private static void doPython()
{
ScriptEngine engine = Python.CreateEngine();
engine.ExecuteFile(@"test.py");
}
답변
C에서 Python 스크립트 실행
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();
}
}
}
파이썬 sample_script
"Python C # Test"인쇄
당신은 볼 것이다 ‘파이썬 C # 테스트’ C 번호의 콘솔에서.
답변
나는 똑같은 문제에 부딪 쳤고 도덕성 마스터의 대답은 나를 위해 그것을하지 않았다. 이전 답변을 기반으로 다음이 작동했습니다.
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는 cmd 행 인수 100으로 test.py를 실행하려는 경우 @C:/Python26/python.exe
args가 C://Python26//test.py 100
됩니다. .py 파일의 경로에는 @ 기호가 없습니다.
답변
또한 이것에주의를 기울이십시오.
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
잘 작동합니다.
답변
Argument에서 WorkingDirectory를 설정하거나 python 스크립트의 전체 경로를 지정하십시오.
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);
}
}
답변
실제로 Csharp (VS)와 Python과 IronPython을 쉽게 통합 할 수 있습니다. 그다지 복잡하지는 않습니다 … Chris Dunaway는 이미 답변 섹션에서 말했듯이 내 프로젝트를 위해이 통합을 구축하기 시작했습니다. N은 매우 간단합니다. 다음 단계를 따르면 N 결과를 얻을 수 있습니다.
1 단계 : VS를 열고 비어있는 새 ConsoleApp 프로젝트를 작성하십시오.
2 단계 : 도구-> NuGet 패키지 관리자-> 패키지 관리자 콘솔로 이동합니다.
3 단계 :이 후 브라우저에서이 링크를 열고 NuGet 명령을 복사하십시오. 링크 : https://www.nuget.org/packages/IronPython/2.7.9
4 단계 : 위 링크를 연 후 PM> Install-Package IronPython -Version 2.7.9 명령을 복사하여 VS의 NuGet Console에 붙여 넣습니다. 지원 패키지를 설치합니다.
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 단계 : 코드 저장 및 실행