在Python中使用subprocess调用带JAVA_OPTS的Java JAR文件
示例代码:
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 个回答
其实不需要使用JAVA_OPTS这个选项,只要在call()
里多加一些参数就可以了。比如:
import subprocess
subprocess.call(['java', '-jar', 'temp.jar', '-Xmx1024m', '-Xms256m'])
你可以这样做,但在文档中找到具体的方法就像大海捞针一样。
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)