Solución:
si llama al subproceso de esa manera:
subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])
en realidad estás dando el argumento /home/somedir/subdir/*
al mv
comando, con un real *
expediente. es decir, estás intentando mover el *
expediente.
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
usará el shell que expandirá el primer argumento.
Nota Bene: cuando se usa el shell=True
argumento que necesita para cambiar su lista de argumentos en una cadena que se le dará al shell.
Insinuación: También puede utilizar el os.rename()
o shutil.move()
funciones, junto con os.path.walk()
o os.listdir()
para mover los archivos al destino de una manera más pitónica.
Puede resolver esto agregando el parámetro shell=True
, para tener en cuenta los comodines en su caso (y así escribir el comando directamente, sin ninguna lista):
subprocess.call("mv /home/somedir/subdir/* somedir/", shell=True)
Sin ella, el argumento se da directamente a la mv
comando con el asterisco. Es el trabajo de shell devolver todos los archivos que coinciden con el patrón en general.
Estás usando shell globbing *
, y esperando el mv
comando para saber lo que significa. Puede obtener el mismo error de un shell de comandos de esta manera:
$ mv 'somedir/subdir/*' ...
Observe las comillas. El caparazón generalmente hace una comparación global en *
para usted, pero los comandos no hacen eso en sus líneas de comando; ni siquiera un caparazón lo hace. Hay una función de biblioteca de C llamada fnmatch
que hace globbing al estilo shell por usted, que cada lenguaje de programación copia más o menos. Incluso podría tener el mismo nombre en Python. O podría tener la palabra “glob”; No recuerdo