Такого рода вопросы задавались раньше в разной степени, но я чувствую, что на него нет краткого ответа, поэтому я задаю его снова.
Я хочу запустить скрипт на Python. Скажем так:
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
.
Я давно искал и могу найти только людей, предлагающих использовать IronPython или что-то подобное. Но должен быть способ вызвать скрипт Python из C #.
Некоторые пояснения:
Мне нужно запустить его с C #, мне нужно записать вывод, и я не могу использовать IronPython или что-то еще. Какой бы хак у вас ни был, все будет в порядке.
PS: Фактический код 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
.Я не совсем уверен, как должна быть отформатирована строка аргумента для python, но вам понадобится что-то вроде этого:
источник
c:\python26\python.exe
аcmd
затемc:\temp\code.py c:\temp\testfile.txt
какargs
он должен работать?"PATH"
даже если там нет пробелов ... странно ...UseShellExecute
вfalse
иRedirectStandardOutput
кtrue
.Если вы хотите использовать IronPython, вы можете выполнять скрипты прямо на C #:
Загрузите IronPython здесь.
источник
Выполнить скрипт Python из C
Создайте проект C # и напишите следующий код.
Python sample_script
Вы увидите «Python C # Test» в консоли C #.
источник
C:\Users\Documents\Visual Studio 2019
. Из-за пробела в пути к папке он рассматривается как разделитель аргументов, поэтому я понял, чтоfileName
невозможно найти. Есть ли способ сбежать из космоса?Я столкнулся с той же проблемой, и ответ Мастера морали не помог мне. Следующее, основанное на предыдущем ответе, сработало:
Например, cmd будет,
@C:/Python26/python.exe
а args -C://Python26//test.py 100
если вы хотите выполнить test.py с аргументом строки cmd 100. Обратите внимание, что путь к файлу .py не имеет символа @.источник
start
имеет те же значенияТакже обращаю на это ваше внимание:
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
Отлично работает.
источник
Задайте WorkingDirectory или укажите полный путь к скрипту python в аргументе
источник
На самом деле довольно просто сделать интеграцию между Csharp (VS) и Python с IronPython. Это не так уж и сложно ... Как уже сказал Крис Данауэй в разделе ответов, я начал создавать эту интеграцию для своего собственного проекта. 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 и вставьте ее в консоль NuGet в VS. Он установит вспомогательные пакеты.
Шаг 5: Это мой код, который я использовал для запуска файла .py, хранящегося в моем каталоге Python.exe.
Шаг 6: сохраните и выполните код
источник
У меня проблемы с
stdin/stout
- когда размер полезной нагрузки превышает несколько килобайт, он зависает. Мне нужно вызывать функции Python не только с короткими аргументами, но и с пользовательской полезной нагрузкой, которая может быть большой.Некоторое время назад я написал библиотеку виртуальных акторов, которая позволяет распределять задачи на разные машины через Redis. Чтобы вызвать код Python, я добавил функции для прослушивания сообщений от Python, их обработки и возврата результатов обратно в .NET. Вот краткое описание того, как это работает .
Он также работает на одной машине, но требует наличия экземпляра Redis. Redis добавляет некоторые гарантии надежности - полезная нагрузка сохраняется до тех пор, пока работа не подтвердит завершение. Если обработанный умирает, полезная нагрузка возвращается в очередь заданий, а затем повторно обрабатывается другим исполнителем.
источник