appeler une commande shell à partir de python

J’ai une commande shell équivalente (illustrée ci-dessous) que j’essaie d’exécuter “en l’état” à partir d’un script python en utilisant la commande call sur une boîte Linux et en courant dans une erreur de compilation. Où est-ce que je me trompe?

from subprocess import call def main (): #ssh -p 29418 company.com gerrit query --commit-message --files --current-patch-set status:open project:platform/vendor/company-proprietary/wlan branch:master |grep refs| awk -F ' ' {'print $2'} |tee refspecs.txt call (["ssh -p 29418 company.com gerrit query", "--commit-message", "--files", "--current-patch-set", "status:open project:platform/vendor/company-proprietary/wlan branch:master","|grep refs| awk -F ' ' {'print $2'} |tee refspecs.txt")] if __name__ == '__main__': main() 

 from subprocess import check_call with open("refspecs.txt", "wb") as file: check_call("ssh -p 29418 company.com " "gerrit query --commit-message --files --current-patch-set " "status:open project:platform/vendor/company-proprietary/wlan branch:master |" "grep refs |" "awk -F ' ' '{print $2}'", shell=True, # need shell due to the pipes stdout=file) # redirect to a file 

J’ai enlevé le tee pour supprimer la stdout.

Note: une partie ou même la totalité de la commande peut être implémentée en Python.

Vous devez diviser "ssh -p 29418 company.com gerrit query" (faites-le manuellement, sans utiliser .split() etc.).

En ce moment, votre appel à subprocess.call() tente d’exécuter toute cette chaîne et vous n’avez évidemment rien avec ce nom dans votre PATH.

Comme vous configurez un pipeline assez sérieux, le plus simple est d’exécuter la commande en utilisant le shell. En outre, envisagez d’utiliser check_call pour savoir s’il y a un problème. Et bien sûr le )] à la fin devrait être ]) pour corriger l’erreur de compilation:

 from subprocess import check_call def main (): check_call("ssh -p 29418 company.com gerrit query --commit-message --files --current-patch-set status:open project:platform/vendor/company-proprietary/wlan branch:master | grep refs | awk -F ' ' {'print $2'} | tee refspecs.txt", shell=True) if __name__ == '__main__': main() 

Vous aviez le) et] dans le mauvais ordre pour fermer l’appel.

 call (["ssh -p 29418 company.com gerrit query", "--commit-message", "--files", "--current-patch-set", "status:open project:platform/vendor/company-proprietary/wlan branch:master","|grep refs| awk -F ' ' {'print $2'} |tee refspecs.txt"])