python子进程调用,用java\u opts调用java jar文件

q3qa4bjr  于 2021-07-04  发布在  Java
关注(0)|答案(0)|浏览(230)

我正在尝试从python脚本对jar中构建的java类进行子进程调用。我正在aws批处理中的docker容器上运行python代码。我将dockerfile中的classpath环境变量设置为包含包含jar文件的目录。

ENV CLASSPATH /path/to/dir/containing/jar/file

当我将带有参数的整个命令作为字符串传递给subprocess时,它可以正常工作。

runnable_command = "java $JAVA_OPTS " \
                   "RunCommand " \
                   "-b arg_b"

sp = subprocess.Popen(runnable_command,
                      stdin=subprocess.PIPE,
                      stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT,
                      close_fds=True,
                      shell=True,
                      universal_newlines=True,
                      env=os.environ)

result, stderr_data = sp.communicate()
print(result)

但为此,我必须使变量“shell=true”具有安全风险。因此,我修改了变量“shell=false”,并将命令和参数作为列表传递给子进程。这也很好。

runnable_command = ["/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.x86_64/jre/bin/java", "$JAVA_OPTS", "<ClassName>"]

但是,我正在dockerfile中设置java\u opts环境变量,以便将log4j配置文件传递给jvm。

ENV JAVA_OPTS="-Dlog4j.configurationFile=/opt/amazon/lib/log4j2.xml"

这一点很重要,因为我想将这个java脚本中的日志通过管道传输到python脚本中。当我将java\u opts添加到命令时,它会失败,并出现以下错误:

runnable_command = ["/usr/lib/jvm/java-1.8.0-jdk-1.8.0.252.b09-2.x86_64/jre/bin/java", "$JAVA_OPTS", "<ClassName>"]

我无法将java\u opts传递到subprocess命令中的参数列表。它找不到log4j.xml文件。我在stackoverflow中遵循了这个问题,但是它失败了,并且出现了相同的错误,即使在将java\u opts添加到“env”参数之后也是如此。
'错误:找不到或加载主类$java\u opts\n'
另外,当我以列表形式传递参数时,我不能运行“java”,但我必须传递java可执行文件的绝对路径。
有人能帮我回答以下问题吗?
如何将log4j配置传递给这个java命令?
为什么在使用列表而不是字符串运行子进程时,必须将绝对路径传递给java命令?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题