昨日、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 .....
呼び出されたシェルスクリプトの先頭に次の行を追加して、これを解決しました。
#!/bin/sh
これにより、スクリプトの実行時にシステムが常に正しいインタープリターを使用することが保証されます。
次の声明は私のために働いた
subprocess.Popen(['sh','my_script.sh'])
@tripleeeが言ったように、スクリプトの実行に問題があります。確認してください:
参照: なぜ '#!/ usr/bin/env python'は単なる '#!/ usr/bin/python'よりも正しいのでしょうか?
これは、バイナリがシステムで実行されることを意図していない場合にも発生する可能性があります。
私は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
エラーメッセージは、外部プログラムが有効な実行可能ファイルではないことを示唆しています。
このエラーは、実行可能ファイルが、サブプロセスが実行するための所定の形式で提供されていないためです。
例:
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()も使用できます