python中的子进程调用,用JAVA_OPTS调用java jar文件

use*_*061 10 python java

示例代码:

import subprocess
subprocess.call(['java', '-jar', 'temp.jar'])
Run Code Online (Sandbox Code Playgroud)

如何在上面的命令中指定JAVA_OPTS?当我使用上面的命令时,我得到'java.lang.OutOfMemoryError:无法创建新的本机线程',我认为在命令中指定JAVA_OPTS可以解决问题.

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

and*_*otn 12

你可以做到这一点,但在文档中找到如何做到这一点是一种疯狂的追逐.

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)
Run Code Online (Sandbox Code Playgroud)


and*_*ler 6

没有必要使用JAVA_OPTS - 只需要传递更多的参数call().例如:

import subprocess
subprocess.call(['java', '-jar', 'temp.jar', '-Xmx1024m', '-Xms256m'])
Run Code Online (Sandbox Code Playgroud)