用java_OPTS调用javajar文件的Python子进程调用
我正在尝试从python脚本向构建在jar中的java类进行子流程调用。我正在AWS批处理中的docker容器上运行python代码。我在Dockerfile中设置了CLASSPATH环境变量,以包括包含jar文件的目录用java_OPTS调用javajar文件的Python子进程调用,java,python,subprocess,log4j,java-opts,Java,Python,Subprocess,Log4j,Java Opts,我正在尝试从python脚本向构建在jar中的java类进行子流程调用。我正在AWS批处理中的docker容器上运行python代码。我在Dockerfile中设置了CLASSPATH环境变量,以包括包含jar文件的目录 ENV CLASSPATH /path/to/dir/containing/jar/file 当我将带有参数的整个命令作为字符串传递给子流程时,它可以正常工作 runnable_command = "java $JAVA_OPTS " \
ENV CLASSPATH /path/to/dir/containing/jar/file
当我将带有参数的整个命令作为字符串传递给子流程时,它可以正常工作
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)
runnable_command = ["/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.x86_64/jre/bin/java", "$JAVA_OPTS", "<ClassName>"]
但为此,我必须使变量“shell=True”具有安全风险。因此,我修改了变量'shell=False',并将命令和参数作为列表传递给子流程
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)
runnable_command = ["/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.x86_64/jre/bin/java", "$JAVA_OPTS", "<ClassName>"]
这一点很重要,因为我想通过管道将日志从这个java脚本传输到我的python脚本。
当我向命令添加JAVA_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>"]
runnable_command=[“/usr/lib/jvm/java-1.8.0-jdk-1.8.0.252.b09-2.x86_64/jre/bin/java”、“$java_OPTS”、”“]
我无法在subprocess命令中将JAVA_OPTS传递到参数列表中。它找不到log4j.xml文件。我遵循了这一点,但它失败了,并且出现了相同的错误,即使在将JAVA_OPTS添加到“env”参数之后也是如此
'错误:找不到或加载主类$JAVA\u OPTS\n'
此外,当我以列表形式传递参数时,我无法运行“java”,但我必须传递java可执行文件的绝对路径
有人能帮我回答以下问题吗
Java不使用Java_OPTS环境变量。它由一些应用程序服务器启动脚本使用。shell在命令行上进行环境变量替换,因此当您不使用shell时,不会进行替换。@tgdavies我明白了,这是有意义的,谢谢!那么我如何将log4j配置路径传递到“Java”命令?Sho我可以在subprocess命令中硬编码吗?这是唯一的方法吗?您可以在Python中查找环境变量,例如:runnable_command=[“/…/java”,os.environ['java_OPTS'],“”]@tgdavies是的,我可以这样做。我只是希望找到一种方法,不从Python传递它,并且java代码能够找到它。