Esse tipo de pergunta já foi feito em vários graus, mas acho que não foi respondido de maneira concisa e, portanto, pergunto novamente.
Eu quero executar um script em Python. Vamos dizer que é isso:
if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
s = f.read()
print s
Que obtém um local para o arquivo, lê e depois imprime seu conteúdo. Não é tão complicado.
Ok, então como executo isso em c #?
Isto é o que eu tenho agora:
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);
}
}
}
Quando passo o code.py
local como cmd
e o filename
local como args
ele não funciona. Foi-me dito que eu deveria passar python.exe
como o cmd
, e depois code.py filename
como o args
.
Estou procurando há algum tempo e só consigo encontrar pessoas sugerindo o uso do IronPython ou algo assim. Mas deve haver uma maneira de chamar um script Python de C #.
Alguns esclarecimentos:
Preciso executá-lo em C #, preciso capturar a saída e não posso usar o IronPython ou qualquer outra coisa. Qualquer que seja o truque que você tenha, tudo ficará bem.
PS: O código Python atual que estou executando é muito mais complexo que isso, e retorna a saída que eu preciso em C #, e o código C # estará constantemente chamando o código Python.
Finja que este é o meu código:
private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
fonte
Respostas:
A razão pela qual não está funcionando é porque você tem
UseShellExecute = false
.Se você não usar o shell, precisará fornecer o caminho completo para o executável python como
FileName
e criar oArguments
string para fornecer o script e o arquivo que deseja ler.Observe também que você não pode, a
RedirectStandardOutput
menos queUseShellExecute = false
.Não tenho muita certeza de como a sequência de argumentos deve ser formatada para python, mas você precisará de algo assim:
fonte
c:\python26\python.exe
comocmd
e, em seguida,c:\temp\code.py c:\temp\testfile.txt
comoargs
deve funcionar?"PATH"
mesmo se não há espaços ... estranho ...UseShellExecute
parafalse
eRedirectStandardOutput
paratrue
.Se você estiver disposto a usar o IronPython, poderá executar scripts diretamente em C #:
Obtenha o IronPython aqui.
fonte
Executar script Python de C
Crie um projeto C # e escreva o seguinte código.
Sample_script do Python
Você verá o 'Python C # Test' no console do C #.
fonte
C:\Users\Documents\Visual Studio 2019
. Por causa do espaço no caminho da pasta, ele é tratado como o delimitador de args, então obtive ofileName
que não pode ser encontrado. Existe uma maneira de escapar do espaço?Encontrei o mesmo problema e a resposta do Mestre Moralidade não fez isso por mim. O seguinte, baseado na resposta anterior, funcionou:
Como exemplo, cmd seria
@C:/Python26/python.exe
e args seriaC://Python26//test.py 100
se você desejasse executar test.py com o argumento de linha cmd 100. Observe que o caminho do arquivo .py não possui o símbolo @.fonte
start
tem os mesmos valoresApenas também para chamar sua atenção para isso:
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
Isso funciona muito bem.
fonte
Defina WorkingDirectory ou especifique o caminho completo do script python no argumento
fonte
Na verdade, é muito fácil fazer a integração entre o Csharp (VS) e o Python com o IronPython. Não é tão complexo ... Como Chris Dunaway já disse na seção de respostas, comecei a criar essa integração para o meu próprio projeto. N é bem simples. Basta seguir estas etapas: você obterá seus resultados.
Etapa 1: Abra o VS e crie um novo projeto vazio do ConsoleApp.
Etapa 2: Vá para Ferramentas -> Gerenciador de Pacotes NuGet -> Console do Gerenciador de Pacotes.
Etapa 3: Depois disso, abra este link no seu navegador e copie o Comando NuGet. Link: https://www.nuget.org/packages/IronPython/2.7.9
etapa 4: Após abrir o link acima, copie o comando PM> Install-Package IronPython -Version 2.7.9 e cole-o no NuGet Console no VS. Ele instalará os pacotes de suporte.
Etapa 5: Este é o meu código que usei para executar um arquivo .py armazenado no meu diretório Python.exe.
etapa 6: salve e execute o código
fonte
Estou tendo problemas com
stdin/stout
- quando o tamanho da carga útil excede vários kilobytes, ele trava. Preciso chamar funções Python não apenas com alguns breves argumentos, mas com uma carga útil personalizada que pode ser grande.Há um tempo atrás, escrevi uma biblioteca de atores virtuais que permite distribuir tarefas em diferentes máquinas via Redis. Para chamar o código Python, adicionei funcionalidade para escutar mensagens do Python, processá-las e retornar resultados ao .NET. Aqui está uma breve descrição de como funciona .
Também funciona em uma única máquina, mas requer uma instância Redis. O Redis adiciona algumas garantias de confiabilidade - a carga útil é armazenada até que um trabalho confirme a conclusão. Se um trabalhador morre, a carga útil é retornada para uma fila de trabalhos e, em seguida, é reprocessada por outro trabalhador.
fonte