it-swarm.com.de

subprocess.Popen (): OSError: [Errno 8] Ausführungsformatfehler in Python

Gestern habe ich einen Python script geschrieben und ausgeführt, der eine Shell mit subprocess.Popen(command.split()) ausführt, wobei der Befehl string ist, der das .sh-Skript und sein Argument darstellt. Dieses Skript hat bis gestern funktioniert. Heute habe ich dasselbe Skript ausgeführt und jetzt stoße ich ständig auf diesen Fehler.

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

Ich weiß, dass es ähnliche Fragen gibt, die zuvor in Bezug auf diese Frage gestellt wurden, aber in meinem Fall habe ich alles versucht, was meinen Zweck nicht erfüllt. Die Verwendung von Shell=True funktioniert nicht, da mein Shell-Skript ein anderes Shell-Skript aufruft, vor dem eine Umgebung festgelegt werden muss, um das Skript auszuführen. Ich stehe schlecht da. Ich starte einfach einmal mein System neu. Ich verwende ubuntu 12.04

BEARBEITEN:

 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

Ich habe dieses Problem gelöst, indem ich diese Zeile oben in das aufgerufene Shell-Skript setzte:

#!/bin/sh

Dies garantiert, dass das System beim Ausführen des Skripts immer den richtigen Interpreter verwendet.

63
William Pietri

Die folgende Aussage hat bei mir funktioniert

subprocess.Popen(['sh','my_script.sh'])

17
neau

Wie @tripleee sagte, gibt es ein Problem bei der Ausführung Ihres Skripts. Stelle sicher:

  • Ändern Sie den Shell-Befehl in "./my_path/my_script.sh" oder "/ bin/bash my_path/my_script.sh". Berücksichtigen Sie ggf. Umgebungsvariablen.
  • Beide Skripte haben ein Ausführungsbit gesetzt (chmod + x)
  • Die Dateien sind an dem Speicherort vorhanden, von dem sie meinen, dass sie dies tun. (Verwenden Sie abspath oder überprüfen Sie die Umgebung.)
  • Die Dateien haben Inhalt
  • Versuchen Sie, die erste Zeile zu entfernen und erneut einzugeben. Ich empfehle, die gesamte Zeile zu töten und mehrmals die Rücktaste zu drücken, falls vor dem # ein nicht druckbares Zeichen steht!

Siehe auch: Warum ist '#!/Usr/bin/env python' angeblich richtiger als nur '#!/Usr/bin/python'?

4
Curtis Mattoon

Dies kann auch passieren, wenn die Binärdatei nicht auf Ihrem System ausgeführt werden soll.

Ich bin unter OSX, aber die Binärdatei, die ich ausgeführt habe, ist nicht für OSX gedacht, wie ich bei der Verwendung von file path/to/binary sah:

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

Die Fehlermeldung weist darauf hin, dass das externe Programm keine gültige ausführbare Datei ist.

2
tripleee

Der Fehler liegt darin, dass die ausführbaren Dateien nicht im vorgeschriebenen Format für die Ausführung des Unterprozesses angegeben werden.

beispiel:

Shell_command1 = r "/ Pfad/zu/ausführbare Datei/Shell/Datei"

Shell_command2 = r "./ Pfad/zu/ausführbar/Shell/Datei"

subprocess.call (Shell_command1) oder subprocess.Popen (Shell_command1) kann Shell_command1 nicht ausführen, da für den Unterprozess ein ausführbarer Befehl wie mailx, ls, ping usw. oder ein ausführbares Skript wie Shell_command2 erforderlich ist 

subprocess.call (["sh", Shell_command1]) subprocess.Popen (["sh", Shell_command1])

sie können jedoch auch os.system () oder os.Popen () verwenden