【问题标题】:Get java version number from python从python获取java版本号
【发布时间】:2015-10-26 18:36:46
【问题描述】:

我需要从 python(或 bash)获取 java 版本号,例如“1.5”。

我会使用:

os.system('java -version 2>&1 | grep "java version" | cut -d "\\\"" -f 2')

但返回 1.5.0_30

比如数字变成“1.10”就需要兼容。

我想使用 cut 或 grep 甚至 sed。 它应该在一行中。

【问题讨论】:

  • “它需要兼容” - 与什么兼容?你到底想达到什么目的? “它应该在一行中” - 为什么?
  • 与较新的 java 版本兼容。并在一行中保持代码干净。
  • 你为什么认为它会破坏例如"1.10"?您正在通过os.system 运行终端命令,我认为 "clean" 已经过去了...
  • @jteichert 单行代码不一定是干净的代码。
  • @fedorqui 我只需要主要和次要版本。原因是,这必须进入 waf 脚本的构建函数。那只接受major.minor版本(至少我刚才用1.5.0的时候还不行)bld(features = 'javac jar', compat = '1.5', ... )

标签: python bash sed grep cut


【解决方案1】:

考虑这样的输出:

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

您可以像这样使用awk 获取版本号:

$ java -version 2>&1 | awk -F[\"_] 'NR==1{print $2}'
1.8.0

或者,如果您只想要前两个 . 分隔的数字:

$ java -version 2>&1 | awk -F[\"\.] -v OFS=. 'NR==1{print $2,$3}'
1.8

这里,awk 将字段分隔符设置为 "_(或 .),以便将行分割成几块。然后,它在第一行打印第二个字段(由NR==1 表示)。通过设置OFS,我们指示输出字段分隔符是什么,因此print $2, $3 会打印第二个字段,然后是第三个字段,中间是.

要在 Python 中使用它,您需要正确转义:

>>> os.system('java -version 2>&1 | awk -F[\\\"_] \'NR==1{print $2}\'')
1.8.0
>>> os.system('java -version 2>&1 | awk -F[\\\"\.] -v OFS=. \'NR==1{print $2,$3}\'')
1.8

【讨论】:

  • os.system()无法捕获孩子的输出,所以这种方法比其他方法不太实用。
  • @mhawke 不知道为什么这里可能需要孩子的输出。另外,正如我在彼得伍德的回答下面所说的那样,我也认为他的回答是优越的,因为它完全使用 Python。
  • 如果你真的想用获得的版本号做任何事情,那么孩子的输出肯定是必要的。
  • 你真的想在这里避免os.system()和Awk。 subprocess 答案应该是被接受的答案。
【解决方案2】:

Java 运行时似乎将版本信息发送到标准错误。你可以使用 Python 的 subprocess 模块来解决这个问题:

>>> import subprocess
>>> version = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)

>>> print version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) Client VM (build 24.79-b02, mixed mode)

您可以使用正则表达式获取版本:

>>> import re
>>> pattern = '\"(\d+\.\d+).*\"'

>>> print re.search(pattern, version).groups()[0]
1.7

如果您使用的是 2.7 之前的 Python 版本,请查看以下问题:subprocess.check_output() doesn't seem to exist (Python 2.6.5)

【讨论】:

  • 非常好的一个!我从中学到了很多,比我打电话给外部awk 更好。
  • 这是正确的答案。使子流程尽可能简单(只需从java 获取输出),并在Python 中处理生成的字符串。
  • 谢谢,一句话:只有当我将check_output 替换为check_call 时,子进程才有效。我已经安装了 python 2.6。
  • @jteichert 我已经用a question 的链接更新了答案,关于缺少check_output,pre-2.7。
  • 如果您设置了JAVA_TOOL_OPTIONS env 变量,那么 java 将在实际结果之前打印选项,这可能会在以后破坏您的正则表达式。
【解决方案3】:

您无法使用os.system() 捕获命令的输出。相反,请使用subprocess.check_output():

>>> import subprocess
>>> java_version = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
>>> java_version
'openjdk version "1.8.0_51"\nOpenJDK Runtime Environment (build 1.8.0_51-b16)\nOpenJDK 64-Bit Server VM (build 25.51-b03, mixed mode)\n'

现在您可以收集命令输出,您可以使用 Python 提取版本号,而不是通过其他命令进行管道传输(顺便说一下,这需要使用安全性较低的 shell=True 参数到 check_output)。

>>> version_number = java_version.splitlines()[0].split()[-1].strip('"')
>>> major, minor, _ = version_number.split('.')
>>> print 'Major: {}, Minor: {}'.format(major, minor)
Major: 1, Minor: 8

【讨论】:

    【解决方案4】:

    你可以让 grep 处理一个正则表达式:

    java -version 2>&1 | grep -Eow '[0-9]+\.[0-9]+' | head -1
    

    【讨论】:

      【解决方案5】:

      蟒蛇

      import os;
      
      os.system("java -version 2>&1 | grep 'version' 2>&1 | awk -F\\\" '{ split($2,a,\".\"); print a[1]\".\"a[2]}'");
      
      xxx=os.popen("java -version 2>&1 | grep 'version' 2>&1 | awk -F\\\" '{ split($2,a,\".\"); print a[1]\".\"a[2]}'").read();
      
      print xxx
      1.8
      

      【讨论】:

        【解决方案6】:

        这是一个旧帖子,但如果有人需要它:

        import subprocess
        import re
        
        javaPath = 'C:/.../java.exe'
        
        javaInfo = subprocess.check_output(javaPath + ' -version', shell=True, stderr=subprocess.STDOUT)
        javaVersion = re.search(r'"[0-9\._]*"', javaInfo.decode().split("\r")[0]).group().replace('"', '')
        
        print(javaVersion)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-27
          • 2015-09-23
          • 2018-04-01
          相关资源
          最近更新 更多