web-dev-qa-db-ja.com

subprocess.Popen():OSError:[Errno 8] PythonのExecフォーマットエラー?

昨日、python scriptを実行するShellを実行し、subprocess.Popen(command.split())を実行しました。ここで、コマンドは.shスクリプトを構成する文字列で、このスクリプトは昨日まで正常に機能していましたが、今日、同じスクリプトを実行したところ、このエラーが継続的に発生しています。

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

この質問に関連して以前に尋ねられた同様の質問があることは知っていますが、私の場合は、私の目的を解決しないすべてを試しました。 Shell=Trueを使用しても機能しません。これは、シェルスクリプトが別のシェルスクリプトを呼び出すため、そのスクリプトの実行前に何らかの環境を設定する必要があるためです。私はこれでひどく立ち往生しています。システムを一度再起動するだけです。 ubuntu 12.04を使用しています

編集:

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

呼び出されたシェルスクリプトの先頭に次の行を追加して、これを解決しました。

#!/bin/sh

これにより、スクリプトの実行時にシステムが常に正しいインタープリターを使用することが保証されます。

81
William Pietri

次の声明は私のために働いた

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

17
neau

@tripleeeが言ったように、スクリプトの実行に問題があります。確認してください:

  • シェルコマンドを「./my_path/my_script.sh」または「/ bin/bash my_path/my_script.sh」に変更します。必要に応じて、環境変数を考慮してください。
  • 両方のスクリプトに実行ビットが設定されています(chmod + x)
  • ファイルは、あなたがそう思う場所に存在します。 (abspathを使用するか、環境を確認します)
  • ファイルには内容があります
  • 最初の行を削除して再入力してみてください。行全体を削除し、#!の前に印刷できない文字がある場合はバックスペースを数回押すことをお勧めします。

参照: なぜ '#!/ usr/bin/env python'は単なる '#!/ usr/bin/python'よりも正しいのでしょうか?

4
Curtis Mattoon

これは、バイナリがシステムで実行されることを意図していない場合にも発生する可能性があります。

私はOSXを使用していますが、実行中のバイナリはOSX向けではありません。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

エラーメッセージは、外部プログラムが有効な実行可能ファイルではないことを示唆しています。

2
tripleee

このエラーは、実行可能ファイルが、サブプロセスが実行するための所定の形式で提供されていないためです。

例:

Shell_command1 = r "/ path/to/executable/Shell/file"

Shell_command2 = r "./ path/to/executable/Shell/file"

subprocess.call(Shell_command1)またはsubprocess.Popen(Shell_command1)は、Shell_command1を実行できません。サブプロセスには(mailx、ls、pingなど)のような実行可能コマンドまたはShell_command2のような実行可能スクリプトが必要か、このようなコマンドを指定する必要があるためです

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

ただし、os.system()またはos.Popen()も使用できます