Ejecutar un programa de Python desde un script shell

-  
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

  1. Colaborador
    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
    1. 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
      1. Colaborador
        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
    2. 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
      1. 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
        1. me encontré con problemas "asombrosos"

          ¿puedes desarrollar, por favor?
          0
        2. 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
        3. @pasletempsdetrouverunpseudosin 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
        4. 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
        5. @trauqnejno 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