Este tipo de preguntas se han hecho anteriormente en diversos grados, pero siento que no se ha respondido de manera concisa y, por lo tanto, vuelvo a preguntar.
Quiero ejecutar un script en Python. Digamos que es esto:
if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
s = f.read()
print s
Que obtiene una ubicación de archivo, la lee y luego imprime su contenido. No tan complicado
Bien, entonces, ¿cómo ejecuto esto en C #?
Esto es lo que tengo ahora:
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);
}
}
}
Cuando paso la code.py
ubicación como cmd
y la filename
ubicación ya args
que no funciona. Me dijeron que debía pasar python.exe
como el cmd
, y luego code.py filename
como el args
.
He estado buscando durante un tiempo y solo puedo encontrar personas que sugieran usar IronPython o algo así. Pero debe haber una manera de llamar a un script de Python desde C #.
Alguna aclaración:
Necesito ejecutarlo desde C #, necesito capturar la salida y no puedo usar IronPython ni nada más. Cualquier truco que tengas estará bien.
PD: El código de Python real que estoy ejecutando es mucho más complejo que esto, y devuelve el resultado que necesito en C #, y el código de C # llamará constantemente al código de Python.
Finge que este es mi código:
private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
fuente
Respuestas:
La razón por la que no funciona es porque tú sí
UseShellExecute = false
.Si no usa el shell, tendrá que proporcionar la ruta completa al ejecutable de Python como
FileName
, y construir laArguments
cadena para proporcionar tanto su script como el archivo que desea leer.También tenga en cuenta que no puede a
RedirectStandardOutput
menos queUseShellExecute = false
.No estoy muy seguro de cómo se debe formatear la cadena de argumento para Python, pero necesitará algo como esto:
fuente
c:\python26\python.exe
comocmd
y luegoc:\temp\code.py c:\temp\testfile.txt
comoargs
debería funcionar?"PATH"
incluso si no hay espacios ... extraño ...UseShellExecute
afalse
yRedirectStandardOutput
paratrue
.Si está dispuesto a usar IronPython, puede ejecutar scripts directamente en C #:
Obtén IronPython aquí.
fuente
Ejecutar script Python desde C
Cree un proyecto C # y escriba el siguiente código.
Python sample_script
Verá la 'Prueba de Python C #' en la consola de C #.
fuente
C:\Users\Documents\Visual Studio 2019
. Debido al espacio en la ruta de la carpeta, se trata como delimitador de args, por lo que obtuve elfileName
no se puede encontrar. ¿Hay alguna forma de escapar del espacio?Me encontré con el mismo problema y la respuesta de Master Morality no lo hizo por mí. Lo siguiente, que se basa en la respuesta anterior, funcionó:
Como ejemplo, cmd sería
@C:/Python26/python.exe
y args seríaC://Python26//test.py 100
si desea ejecutar test.py con el argumento de línea cmd 100. Tenga en cuenta que la ruta del archivo .py no tiene el símbolo @.fuente
start
tiene los mismos valoresSolo para llamar su atención sobre esto:
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
Funciona muy bien
fuente
Establezca WorkingDirectory o especifique la ruta completa de la secuencia de comandos de Python en el argumento
fuente
En realidad, es bastante fácil hacer la integración entre Csharp (VS) y Python con IronPython. No es tan complejo ... Como Chris Dunaway ya dijo en la sección de respuestas, comencé a construir esta integración para mi propio proyecto. N es bastante simple. Simplemente siga estos pasos y obtendrá sus resultados.
Paso 1: Abra VS y cree un nuevo proyecto vacío de ConsoleApp.
Paso 2: Vaya a Herramientas -> Administrador de paquetes NuGet -> Consola Administrador de paquetes.
Paso 3: después de esto, abre este enlace en tu navegador y copia el comando NuGet. Enlace: https://www.nuget.org/packages/IronPython/2.7.9
Paso 4: Después de abrir el enlace anterior, copie el comando PM> Install-Package IronPython -Version 2.7.9 y péguelo en NuGet Console en VS. Instalará los paquetes de apoyo.
Paso 5: Este es mi código que he usado para ejecutar un archivo .py almacenado en mi directorio Python.exe.
Paso 6: guarda y ejecuta el código
fuente
Estoy teniendo problemas con
stdin/stout
: cuando el tamaño de la carga útil supera varios kilobytes, se cuelga. Necesito llamar a las funciones de Python no solo con algunos argumentos cortos, sino con una carga útil personalizada que podría ser grande.Hace un tiempo, escribí una biblioteca virtual de actores que permite distribuir tareas en diferentes máquinas a través de Redis. Para llamar al código de Python, agregué funcionalidad para escuchar los mensajes de Python, procesarlos y devolver los resultados a .NET. Aquí hay una breve descripción de cómo funciona .
También funciona en una sola máquina, pero requiere una instancia de Redis. Redis agrega algunas garantías de confiabilidad: la carga útil se almacena hasta que un trabajo confirma la finalización. Si un trabajador muere, la carga útil se devuelve a una cola de trabajo y luego es reprocesada por otro trabajador.
fuente