Ejecutar un programa de Python desde un script shell

pasletempsdetrouverunpseudo Mensajes publicados 4 Estado Miembro -  
lEprofSonDkon Mensajes publicados 227 Estado Miembro -
Hola a la comunidad,

Desde hace un tiempo tengo un problema que me parece diminuto, sin embargo no consigo encontrar soluciones a pesar de mis largas búsquedas (en foros, etc...). Hay que decir que estoy descubriendo los comandos de linux...

He hecho un programa en python que toma como entrada un archivo de datos .dat. Puedo ejecutarlo sin problemas en la consola con el comando "python3 mi_prgm.py nombre_de_mi_archivo.dat".

Ahora, necesito hacer un script shell (o un programa en python, pero he intentado mucho con el script shell) que ejecute mi primer programa tantas veces como archivos de datos que contengan la palabra "NOEUD" en el directorio actual.

Así es como se ve mi código:

for archivo in find -type f -name "NOEUD*.dat"/mi_directorio/*
do
python3 mi_prgm.py archivo
done

Esto genera el error:
FileNotFoundError: [Errno 2] No such file or directory: 'archivo'

Concretamente, tengo la impresión de que el programa de python se está lanzando correctamente, pero que su parámetro de entrada (que debe ser un archivo de datos .dat) no comprende que la variable "archivo" del script shell es un archivo. Y segundo problema, el mensaje de error aparece siempre 5 veces (como si el programa de python intentara lanzarse 5 veces), aunque no hay 5 archivos llamados "NOEUD*.dat"...

¡Gracias de antemano si alguien puede ayudarme!

4 respuestas

UnGnU Mensajes publicados 1468 Estado Colaborador 158
 
Hola,

Antes de lanzar cualquier cosa, generalmente comenzamos por ver qué podría dar un comando como respuesta…

Así que, personalmente, preferiría comenzar viendo qué me devuelve el comando (ver de paso el man find para la sintaxis correcta ;-\) :
find /mi_directorio/ -type f -name "NOEUD*.dat"

Si la respuesta es concluyente, con los ejemplos al final del man find, intentaré incluir el programa en python…

--
Un pingüino en la banquisa.
0
pasletempsdetrouverunpseudo Mensajes publicados 4 Estado Miembro
 
Al probar el comando que indicas, obtengo en retorno los 3 archivos que corresponden a la búsqueda, así que está muy bien, hasta aquí todo funciona correctamente.

Luego lo integro en el programa:

for archivo in find /mi_directorio/ -type f -name "NOEUD*.dat"
do
python3 mi_prgm.py archivo
done

Y ahí obtengo el mismo error... Pero esta vez aparece 6 veces y ya no 5 veces...

¿Podría ser que el problema provenga de mi bucle que escribo "for archivo in find ... ? Dado que el comando find ... devuelve el nombre de los archivos que corresponden a la consulta, me parecería posible...
0
UnGnU Mensajes publicados 1468 Estado Colaborador 158
 
No es necesario un bucle; el comando
find
con sus opciones (especialmente
exec
) o a través de una pipe hacia el comando
xargs
debería ser suficiente.
0
lEprofSonDkon Mensajes publicados 227 Estado Miembro 13
 
Hola,

continúa en Python.

¿Eres capaz de escribir un script de Python que procese un archivo, pero no sabes cómo insertar un bucle para procesar varios?! 8O

Has hecho lo más difícil; la inserción de un bucle en un programa de Python me parece trivial.
pero no hago Python. :/

Y luego
find
para encontrar archivos en el directorio actual es innecesario.
0
pasletempsdetrouverunpseudo Mensajes publicados 4 Estado Miembro
 
lEprofSonDkon, para ser honesto, primero intenté hacerlo en python, pero me encontré con problemas "sorprendentes" que me hicieron decidir escribirlo en un script shell. Y ahora, el script tiene literalmente 3 líneas, así que estoy convencido de que es realmente un problema aún más trivial que en python... Realmente me gustaría lograrlo en script shell... Pero, de hecho, si vuelvo a fallar, lo intentaré de nuevo con python.
0
lEprofSonDkon Mensajes publicados 227 Estado Miembro 13
 
me encontré con problemas "asombrosos"

¿puedes desarrollar, por favor?
0
pasletempsdetrouverunpseudo Mensajes publicados 4 Estado Miembro
 
Bueno, al final volví a ponerme "la cabeza en el python". Lo hice de otra manera y lo logré. Me hubiera gustado hacerlo también en script shell, pero bueno, cuando no puede ser, no puede ser...

¡Gracias a todos!
0
lEprofSonDkon Mensajes publicados 227 Estado Miembro 13 > pasletempsdetrouverunpseudo Mensajes publicados 4 Estado Miembro
 
sin embargo, es muy simple en shell :
for f in /miDirectorio/NOEUD*.dat; do test -f "$f" && echo monPRg.py "$f"; done

pero insisto, es mejor hacerlo en el script de python.
0
trauqnej Mensajes publicados 162 Estado Miembro 23
 
Para tu problema, necesitas poner $fichier en tu bucle
do
python3 mon_prgm.py fichier
done

Porque estás buscando todos los archivos que tienen por nombre NOEUD*.dat.
Entonces, "fichero" es una variable.
Y las variables se "llaman" con un signo de dólar que las precede.
Trauqnej
0
lEprofSonDkon Mensajes publicados 227 Estado Miembro 13 > trauqnej Mensajes publicados 162 Estado Miembro
 
no será suficiente, también necesitaríamos que el
find
estuviera en una Substitución de comandos
pero es una mala práctica analizar una sustitución de comandos con
for
.
0