Такого рода вопросы в разной степени задавались раньше, но я чувствую, что на них не было краткого ответа, и поэтому я задаю его снова.
Я хочу запустить скрипт на Python. Допустим, это:
if __name__ == '__main__': withopen(sys.argv[1], 'r') as f: s = f.read() print s
Который получает местоположение файла, считывает его, затем печатает его содержимое. Не так уж и сложно.
Хорошо, итак, как мне запустить это на C #?
Это то, что у меня есть сейчас:
privatevoidrun_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 location as cmd и filename location as args, это не работает. Мне сказали, что я должен передать python.exe как cmd, а затем code.py filename как args.
Я уже некоторое время ищу и могу найти только людей, предлагающих использовать IronPython или что-то в этом роде. Но должен быть способ вызвать скрипт Python из C #.
Некоторые пояснения:
Мне нужно запустить его с C #, мне нужно зафиксировать выходные данные, и я не могу использовать IronPython или что-либо еще. Любой хак, который у вас есть, подойдет.
PS: Фактический код Python, который я запускаю, намного сложнее этого, и он возвращает выходные данные, которые мне нужны на C #, и код C # будет постоянно вызывать код Python.
Представьте, что это мой код:
privatevoidget_vals() { for (int i = 0; i < 100; i++) { run_cmd("code.py", i); } }
Переведено автоматически
Ответ 1
Причина, по которой он не работает, заключается в том, что у вас естьUseShellExecute = false.
Если вы не используете оболочку, вам придется указать полный путь к исполняемому файлу python как FileName, и создать Arguments строку для предоставления как вашего скрипта, так и файла, который вы хотите прочитать.
Также обратите внимание, что вы не можете, RedirectStandardOutput еслиUseShellExecute = false.
Я не совсем уверен, как строка аргумента должна быть отформатирована для python, но вам понадобится что-то вроде этого:
using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using System.Windows.Forms; namespaceWindowsFormsApplication1 { publicpartialclassForm1 : Form { publicForm1() { InitializeComponent(); }
Я столкнулся с той же проблемой, и ответ Master Morality не решил ее за меня. Следующее, основанное на предыдущем ответе, сработало:
privatevoidrun_cmd(string cmd, string args) { ProcessStartInfo start = newProcessStartInfo(); 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, если вы хотите выполнить test.py с аргументом строки cmd 100. Обратите внимание, что путь к файлу .py не содержит символа @.