在Python中使用subprocess调用带JAVA_OPTS的Java JAR文件

12 投票
2 回答
21551 浏览
提问于 2025-04-17 15:10

示例代码:

import subprocess
subprocess.call(['java', '-jar', 'temp.jar'])

在上面的命令中,怎么指定JAVA_OPTS呢?我在使用上面的命令时遇到了一个错误,提示'java.lang.OutOfMemoryError: unable to create new native thread',我觉得如果在命令中指定JAVA_OPTS就能解决这个问题。

我确实在.bashrc文件中指定了JAVA_OPTS,但没有任何效果。

2 个回答

7

其实不需要使用JAVA_OPTS这个选项,只要在call()里多加一些参数就可以了。比如:

import subprocess
subprocess.call(['java', '-jar', 'temp.jar', '-Xmx1024m', '-Xms256m'])
14

你可以这样做,但在文档中找到具体的方法就像大海捞针一样。

subprocess.call() 的文档中提到,

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 这里列出的参数只是最常用的,下面的常用参数中会有更详细的说明(所以在简化的签名中有些奇怪的写法)。

然后在常用参数部分的最后,描述了一堆其他参数后说:

这些选项,以及所有其他选项,都在Popen构造函数的文档中有更详细的描述。

那么!Popen的文档给出了完整的参数列表:

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

env就是你需要的那个!不过,如果你直接写env={'JAVA_OPTS': 'foo'},那会覆盖掉所有的环境变量,包括像CLASSPATH这样的东西,可能会导致其他问题。所以你可能想用下面的代码来为新进程添加一个JAVA_OPTS环境变量,而不影响当前进程:

#!/usr/bin/env python2.7

import os
import subprocess

# Make a copy of the environment    
env = dict(os.environ)
env['JAVA_OPTS'] = 'foo'
subprocess.call(['java', '-jar', 'temp.jar'], env=env)

撰写回答