Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java_OPTS调用javajar文件的Python子进程调用_Java_Python_Subprocess_Log4j_Java Opts - Fatal编程技术网

用java_OPTS调用javajar文件的Python子进程调用

用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 " \

我正在尝试从python脚本向构建在jar中的java类进行子流程调用。我正在AWS批处理中的docker容器上运行python代码。我在Dockerfile中设置了CLASSPATH环境变量,以包括包含jar文件的目录

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可执行文件的绝对路径

有人能帮我回答以下问题吗

  • 如何将log4j配置传递给这个java命令
  • 为什么在使用列表而不是字符串运行子流程时,必须将绝对路径传递给java命令

  • Java不使用Java_OPTS环境变量。它由一些应用程序服务器启动脚本使用。shell在命令行上进行环境变量替换,因此当您不使用shell时,不会进行替换。@tgdavies我明白了,这是有意义的,谢谢!那么我如何将log4j配置路径传递到“Java”命令?Sho我可以在subprocess命令中硬编码吗?这是唯一的方法吗?您可以在Python中查找环境变量,例如:runnable_command=[“/…/java”,os.environ['java_OPTS'],“”]@tgdavies是的,我可以这样做。我只是希望找到一种方法,不从Python传递它,并且java代码能够找到它。