使用sh.命令从python调用Java时出现Exec格式错误

使用sh.命令从python调用Java时出现Exec格式错误,java,python,subprocess,exec,sh,Java,Python,Subprocess,Exec,Sh,召唤 给出了错误 import subprocess print subprocess.Popen(['java', '-version']) 但这可以通过将上述更改为 OSError: [Errno 8] Exec format error 我如何用同样的方法修复sh.Command print subprocess.Popen(['java', '-version'], executable='/bin/sh') 因为它会给出完全相同的错误 import sh print sh.Com

召唤

给出了错误

import subprocess
print subprocess.Popen(['java', '-version'])
但这可以通过将上述更改为

OSError: [Errno 8] Exec format error
我如何用同样的方法修复sh.Command

print subprocess.Popen(['java', '-version'], executable='/bin/sh')
因为它会给出完全相同的错误

import sh
print sh.Command('java').bake('-version')()
试试这个

OSError: [Errno 8] Exec format error

@nosklo的答案肯定符合我的要求,我会保留它作为正确答案,但这不是我的问题所在

基本上,正如@nosklo在irc上暗示的那样,当文件之间出现混淆时,就会出现此错误,将二进制文件视为脚本,或将脚本视为二进制文件。因此,这肯定指向构建机器上的java

if sys.platform == 'darwin':
    java = sh.Command('/bin/sh').bake('java')
else:
    java = sh.Command('java')

print java.bake('-version')()
我的Java,/usr/bin/Java是指向可执行脚本Java.new文件的符号链接,没有shebang,它将所有内容转发给Java.old,这是指向主Java的符号链接

谈论复杂,但希望这能帮助那些不能轻松解决问题的人

which java
/usr/bin/java
ls -la /usr/bin/java
/usr/bin/java -> java.new
cat /usr/bin/java
' java.old -Djava.awt.headless=true "$@" '
ls -la /usr/bin/java.old
/usr/bin/java.old -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java