web-dev-qa-db-fra.com

subprocess.Popen (): OSError: [Errno 8] Erreur de format d'exécution en python

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 .....
27
Amit Sharma

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.

63
William Pietri

Comme @tripleee l'a dit, il y a un problème lors de l'exécution de votre script. Assure-toi:

  • Changez la commande Shell en "./my_path/my_script.sh" ou "/ bin/bash my_path/my_script.sh". Compte pour les variables d'environnement, si nécessaire.
  • Les deux scripts ont le bit d'exécution défini (chmod + x)
  • Les fichiers existent à l’emplacement que vous pensez les avoir. (Utilisez abspath ou vérifiez l'environnement)
  • Les fichiers ont un contenu
  • Essayez de supprimer et de retaper la première ligne. Je recommande de supprimer toute la ligne et de revenir plusieurs fois en arrière si un caractère non imprimable se trouvait avant le #!

Voir aussi: Pourquoi "#!/Usr/bin/env python" est-il censé être plus correct que simplement "#!/Usr/bin/python"?

4
Curtis Mattoon

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
2
Joe Flack

Le message d'erreur suggère que le programme externe n'est pas un exécutable valide.

2
tripleee

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 ().

1