我正在尝试从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命令?
暂无答案!
目前还没有任何答案,快来回答吧!