español - Usar Python para ejecutar un comando en cada archivo en una carpeta
ejecutar script python en windows (6)
Intento crear una secuencia de comandos de Python que:
- Mire en la carpeta "/ input"
- Para cada video en esa carpeta, ejecute un comando de mencoder (para transcodificarlo a algo que se pueda reproducir en mi teléfono)
- Una vez que el mencoder haya terminado su ejecución, elimine el video original.
Eso no parece muy difícil, pero apestaba en Python :)
¿Alguna idea sobre cómo debería ser el guión?
Pregunta adicional: ¿Debo usar
os.system
o
subprocess.call
?
Subprocess.call parece permitir una secuencia de comandos más legible, ya que puedo escribir el comando de esta manera:
cmdLine = [''mencoder'', sourceVideo, ''-ovc'', ''copy'', ''-oac'', ''copy'', ''-ss'', ''00: 02: 54 '','' -endpos '', ''00: 00: 54 '','' -o '', destinationVideo]
EDITAR: Ok, eso funciona:
import os, subprocess
bitrate = ''100''
mencoder = ''C://Program Files//_utilitaires//MPlayer-1.0rc2//mencoder.exe''
inputdir = ''C://Documents and Settings//Administrator//Desktop//input''
outputdir = ''C://Documents and Settings//Administrator//Desktop//output''
for fichier in os.listdir(inputdir):
print ''fichier :'' + fichier
sourceVideo = inputdir + ''//' + fichier
destinationVideo = outputdir + ''//' + fichier[:-4] + ".mp4"
commande = [mencoder,
''-of'',
''lavf'',
[...]
''-mc'',
''0'',
sourceVideo,
''-o'',
destinationVideo]
subprocess.call(commande)
os.remove(sourceVideo)
raw_input(''Press Enter to exit'')
He eliminado el comando mencoder, para mayor claridad y porque aún estoy trabajando en ello.
Gracias a todos por su aporte.
O puede usar la función os.path.walk, que le hace más trabajo que simplemente os.walk:
Un estúpido ejemplo:
def walk_func(blah_args, dirname,names):
print '' ''.join((''In '',dirname,'', called with '',blah_args))
for name in names:
print ''Walked on '' + name
if __name__ == ''__main__'':
import os.path
directory = ''./''
arguments = ''[args go here]''
os.path.walk(directory,walk_func,arguments)
Para encontrar todos los nombres de archivo use os.listdir()
.
Luego recorre los nombres de los archivos. Al igual que:
import os
for filename in os.listdir(''dirname''):
callthecommandhere(blablahbla, filename, foo)
Si prefiere un subproceso, use un subproceso. :-)
Python podría ser excesivo para esto.
for file in *; do mencoder -some options $file; rm -f $file ; done
Tuve un problema similar, con mucha ayuda de la web y en esta publicación hice una pequeña aplicación, mi objetivo es VCD y SVCD, y no elimino la fuente, pero creo que será bastante fácil adaptarse a la suya. necesariamente.
Puede convertir 1 video y cortarlo o puede convertir todos los videos en una carpeta, cambiarles el nombre y ponerlos en una subcarpeta / VCD
También agrego una interfaz pequeña, ¡espero que alguien más la encuentre útil!
Puse el código y el archivo aquí por cierto: http://tequilaphp.wordpress.com/2010/08/27/learning-python-making-a-svcd-gui/
Use os.walk para iterar recursivamente sobre el contenido del directorio:
import os
root_dir = ''.''
for directory, subdirectories, files in os.walk(root_dir):
for file in files:
print os.path.join(directory, file)
No hay una diferencia real entre os.system y subprocess.call aquí, a menos que tenga que tratar con archivos con nombres extraños (nombres de archivos que incluyen espacios, comillas, etc.). Si este es el caso, subprocess.call es definitivamente mejor, porque no necesita hacer ninguna cita de shell en los nombres de archivo. os.system es mejor cuando necesita aceptar cualquier comando de shell válido, por ejemplo, recibido del usuario en el archivo de configuración.
AVI
a MPG
(elige tus extensiones):
files = os.listdir(''/input'')
for sourceVideo in files:
if sourceVideo[-4:] != ".avi"
continue
destinationVideo = sourceVideo[:-4] + ".mpg"
cmdLine = [''mencoder'', sourceVideo, ''-ovc'', ''copy'', ''-oac'', ''copy'', ''-ss'',
''00:02:54'', ''-endpos'', ''00:00:54'', ''-o'', destinationVideo]
output1 = Popen(cmdLine, stdout=PIPE).communicate()[0]
print output1
output2 = Popen([''del'', sourceVideo], stdout=PIPE).communicate()[0]
print output2