【问题标题】:subprocess call in python to invoke java jar files with JAVA_OPTSpython中的子进程调用以使用JAVA_OPTS调用java jar文件
【发布时间】:2013-02-07 22:14:39
【问题描述】:

示例代码:

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

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

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

【问题讨论】:

  • 您的问题似乎与 python 无关。因为它正在执行你的命令。

标签: java python


【解决方案1】:

您可以这样做,但在文档中查找如何进行操作有点费力。

subprocess.call() documentation 说,

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 上面显示的参数只是最常见的参数,下面在Frequently Used Arguments 中进行了描述(因此缩写签名中的符号有点奇怪)。

然后Frequently Used Arguments 部分在描述了一堆其他论点后在最后说:

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)

【讨论】:

    【解决方案2】:

    不需要使用 JAVA_OPTS - 只需将更多参数传递给call()。例如:

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

    【讨论】:

    • 非常感谢您的提示
    猜你喜欢
    • 2011-11-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多