Hier, j'ai écrit et exécuté un python script
qui exécute un Shell
en utilisant subprocess.Popen(command.split())
où la commande est une chaîne qui constitue le script .sh
et son argument. Ce script fonctionnait bien jusqu'à hier. Aujourd'hui, j'ai exécuté le même script et maintenant, je rencontre continuellement cette erreur.
p=subprocess.Popen(Shell_command.split())
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
Je sais que des questions similaires ont déjà été posées concernant cette question, mais dans mon cas, j'ai essayé tout ce qui ne résout pas mon objectif. L'utilisation de Shell=True
ne fonctionne pas car mon script Shell appelle un autre script Shell avant lequel un environnement doit être défini pour pouvoir exécuter ce script. Je suis mal coincé dans cela. Je viens de redémarrer mon système une fois. J'utilise ubuntu 12.04
MODIFIER:
import subprocess
import os
import sys
arg1=sys.argv[1]
arg2=sys.argve[2]
Shell_command = 'my_path/my_Shell.sh ' + arg1 + ' '+ arg2
P = subprocess.Popen(Shell_command.split())
P.wait()
my_Shell.sh:
arg1=$1
arg2=$2
cd $TOP
setup the environment and run Shell script
build the kernel ...
execute Shell command .....
J'ai résolu ce problème en plaçant cette ligne en haut du script Shell appelé:
#!/bin/sh
Cela garantira que le système utilise toujours l'interprète correct lors de l'exécution de votre script.
Comme @tripleee l'a dit, il y a un problème lors de l'exécution de votre script. Assure-toi:
Voir aussi: Pourquoi "#!/Usr/bin/env python" est-il censé être plus correct que simplement "#!/Usr/bin/python"?
Cela peut également se produire si le fichier binaire n'est pas conçu pour s'exécuter sur votre système.
Je suis sur OSX, mais le binaire que j'exécutais n'est pas destiné à OSX, comme je l'ai vu grâce à l'utilisation de file path/to/binary
:
webui/bin/wkhtmltopdf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=b6566a9e44c43a0eebf18d8c1dc6cb616801a77e, stripped
Le message d'erreur suggère que le programme externe n'est pas un exécutable valide.
L'erreur est due au fait que les exécutables ne sont pas donnés dans le format prescrit pour que le sous-processus puisse l'exécuter.
exemple:
Shell_command1 = r "/ path/to/executable/Shell/file"
Shell_command2 = r "./ path/to/executable/Shell/file"
subprocess.call (Shell_command1) ou subprocess.Popen (Shell_command1) ne pourra pas exécuter Shell_command1 car le sous-processus nécessite une commande exécutable comme (mailx, ls, ping, etc.) ou un script exécutable comme Shell_command2
subprocess.call (["sh", Shell_command1]) subprocess.Popen (["sh", Shell_command1])
cependant, vous pouvez également utiliser os.system () ou os.Popen ().