tutor - html.parser python 3
Llamando al script Python desde C++ y usando su salida (2)
Aquí hay una solución para incrustar la ejecución de su módulo de Python desde su aplicación C ++. No es mejor ni peor que forzar / ejecutar su script de Python a través de una llamada al sistema, simplemente es una forma diferente de hacerlo. Si es mejor o no depende de su contexto y uso.
Hace algún tiempo, he codificado una forma de cargar módulos de Python como complementos para una aplicación C ++, aquí está la parte interesante .
Básicamente, necesita #include <Python.h>
, luego Py_Initialize()
para iniciar su intérprete de python.
Luego import sys
, usando: PyRun_SimpleString("import sys");
, y puede cargar su complemento haciendo PyRun_SimpleString(''sys.path.append("path/to/my/module/")'')
.
Para intercambiar valores entre C ++ y Python, las cosas se ponen más difíciles, tienes que transformar todos tus objetos C ++ en objetos de python (comenzando la línea 69 en mi script).
Luego, puede llamar a su función usando PyObject_Call_Object(...)
, usando todos los objetos de python que creó como argumentos.
Obtiene el valor de retorno y transforma todos esos valores en objetos C ++. ¡Y no olvides la gestión de la memoria en todo eso!
Para finalizar su intérprete de python, una simple llamada a Py_Finalize()
.
Realmente parece más difícil de lo que realmente es, pero hay que tener mucho cuidado al hacerlo, ya que podría provocar fugas, problemas de seguridad, etc.
Quiero llamar a un script de Python desde C ++ y deseo usar el archivo de salida .csv generado por este script de nuevo en C ++. Intenté esto en main ():
std::string filename = "/home/abc/xyz/script.py";
std::string command = "python ";
command += filename;
system(command.c_str());
Esto llama y ejecuta el script de python.
Los comandos de print
en el Python se están ejecutando. Las cosas se imprimen en la pantalla cuando se llama al script. Hasta ahora tan bueno. Sin embargo, no está creando el archivo .csv (parte del mismo script).
Ejemplo: tenía un archivo training.csv
con 100 entradas . Llamé al script de Python, con pequeños cambios en el script para que el archivo training.csv
ahora debería contener solo 50 entradas en lugar de 100. Se sobrescribe. Sin embargo, tal cosa no está sucediendo. El resto de los comandos en el script ( print
, etc.) están funcionando perfectamente.
El archivo training.csv
debe leerse con C ++ normalmente usando fstream
y getline
.
¿Alguna idea de cómo hacerlo (usando Linux)?
Intente usar el popen()
POSIX en lugar del system()
. Canaliza stdin / stdout del proceso hijo al identificador de archivo devuelto.
FILE* in = popen(command.c_str(), "r");
fscanf(in, ... // or some other method of reading
pclose(in);