Comment exécuter des commandes python complexes en utilisant un sous-processus en utilisant une référence relative?

J’essaie d’exécuter cette commande en utilisant Python:

findSyntax = "find . -maxdepth 2 -name '.config' | cpio -updm ../test1/" subprocess.Popen(findSyntax.split(' ')) 

Mais cette commande ne fonctionnerait tout simplement pas. Lorsque j’exécute cette commande, elle commence à répertorier tous les fichiers (pas seulement .config) sous. répertoire au-delà du maxdepth 2 … qui est une longue liste.

Qu’est-ce que j’oublie ici! Quelqu’un peut-il le signaler? Merci.

REMARQUE: J’ai également essayé d’exécuter subProcess.run avec les mêmes résultats. J’ai été en mesure d’obtenir la partie de recherche en utilisant la commande os.system() .

EDIT: Je voulais juste préciser que cette commande copiera les fichiers trouvés avec la structure de répertoire exacte intacte dans le nouvel emplacement (en créant des sous-répertoires si nécessaire). J’ai essayé cette commande sur le terminal bash, et ça marche bien. Mais je ne pouvais pas le faire fonctionner avec Python.

EDIT2: Ainsi, toute la commande fonctionne avec os.system() , mais je n’ai pas os.system() comment le faire fonctionner avec un subprocess . os.system() est supposé être obsolète, alors je serais très intéressé par la solution à l’aide de subprocess .

S’il vous plaît regarder cette bonne réponse et cela aide aussi

Mais essentiellement, vous ne pouvez pas utiliser votre commande de sous-processus ci-dessus avec un tube.

Permet de parcourir l’exemple simple de tous les fichiers py dans le répertoire courant: ( ls | grep py )
C’est cassé:

 import subprocess subprocess.call(['ls', '|', 'grep', 'py']) 

Étant donné que le sous-processus ne fait qu’un processus à la fois et que vous effectuez un transfert, vous créez en réalité deux processus.

La méthode simple mais limitée (à la plate-forme) consiste à utiliser os.system

 import os os.system('ls | grep py') 

Cela fait littéralement passer une commande shell au système pour qu’elle soit exécutée.

Cependant, vous devez le faire avec un sous-processus en définissant vos canaux:

 # Get all files and pass the stdout to a pipe p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) # then pass that pipe to another process as stdin and do part 2 output = subprocess.check_output(['grep', 'py'], stdin=p1.stdout) print(output) 

Donc, un copier coller pour votre exemple:

 import subprocess p1 = subprocess.Popen("find . -maxdepth 2 -name '.config'".split(), stdout=subprocess.PIPE) output = subprocess.check_output("cpio -updm ../test1/".split(), stdin=p1.stdout) 

Ou avec os :

 os.system("find . -maxdepth 2 -name '.config' | cpio -updm ../test1/")