使用sh.Command从python调用Java时出现exec格式错误

时间:2014-10-02 17:26:55

标签: java python subprocess exec sh

调用

import subprocess
print subprocess.Popen(['java', '-version'])

给出错误

OSError: [Errno 8] Exec format error

但是可以通过将上面的内容改为

来解决
print subprocess.Popen(['java', '-version'], executable='/bin/sh')

如何以相同的方式修复sh.Command?

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

因为它会给出完全相同的错误,

OSError: [Errno 8] Exec format error

2 个答案:

答案 0 :(得分:1)

试试这个

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

print java.bake('-version')()

答案 1 :(得分:0)

@nosklo的回答肯定会按照我的要求行事,并且我会将其作为正确答案,但并不是我的问题所在。< / p>

基本上,正如@nosklo在irc上暗示的那样,当文件之间存在混淆,处理像脚本这样的二进制文件或像二进制文件这样的脚本时,就会出现这种错误。所以在构建机器上肯定指向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

My Java,/ usr / bin / java,是一个可执行脚本的符号链接,java.new文件没有shebang ,它将所有内容转发到java.old,这是一个符号链接到主要Java ...

谈论复杂,但希望这可能会帮助那些无法轻松解决问题的人。