昨天,我编写并运行了一个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
不起作用,因为我的shell脚本调用另一个shell脚本,在此脚本之前必须设置一些环境才能运行该脚本。我严重陷入困境。我只是重启我的系统一次。我正在使用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 .....
答案 0 :(得分:70)
我通过将此行放在被调用的shell脚本的顶部来解决这个问题:
#!/bin/sh
这将保证系统在运行脚本时始终使用正确的解释器。
答案 1 :(得分:17)
以下声明为我工作
subprocess.Popen(['sh','my_script.sh'])
答案 2 :(得分:4)
正如@tripleee所说,执行脚本时出现问题。确保:
另请参阅:Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?
答案 3 :(得分:2)
错误消息表明外部程序不是有效的可执行文件。
答案 4 :(得分:2)
如果二进制文件无意在您的系统上运行,也会发生这种情况。
我在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
答案 5 :(得分:1)
该错误是因为未按规定的格式提供可执行文件,以供子进程执行。
示例:
shell_command1 = r“ /路径/到/可执行文件/ shell /文件”
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()
答案 6 :(得分:-1)
建议安装 binfmt-support 软件包,以帮助系统更好地识别这些内容。无论他们是否有一个shebang线,它都会有所帮助。