我正在处理的java项目有一个.bat
文件和一个.sh
文件,用于构建要运行的项目的CLASSPATH
。 (.bat
代表Windows,.sh
代表其他代码。
现在,我正在编写一个python脚本,需要访问这些脚本创建的类路径,如果在linux上则来自.sh
,而在Windows上则来自.bat
。
目前,我正在为linux做这个:
Popen(['bash', '-c', '. mkcp.sh && echo $CLASSPATH'], stdout=sp.PIPE).communicate()[0].strip()
我无法找到在Windows上执行此操作的等效方法。到目前为止,我已经提出了这个
check_output(['cmd', '/c', 'call mkcp.bat && echo %CLASSPATH%'])
但是这会将mkcp.bat
文件中的所有命令放入stdout。 (将@echo off
添加到该文件对我来说不是一个选项,即我无法修改它。抛开这个问题,主要问题是在批处理文件运行之前%CLASSPATH%
被其值替换,这不是我想要的。
我想到的另一种方法是,如果我创建一个Popen
对象,并运行批处理文件,如果我可以访问该进程的环境,我可以得到我想要的。但是从Popen的文档来看,这看起来并不可能。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
最简单的方法是使用相关命令创建批处理文件。这样,在CMD处理相关行之前,变量不会扩展。同时使用@echo off
禁用echo:
@echo off
call mkcp.bat
echo %CLASSPATH%
然后从Python代码中调用该批处理文件。
如果您想在没有干预批处理文件的情况下执行此操作,请尝试:
check_output(['cmd', '/V:ON', '/c', '"@echo off && call mkcp.bat && echo !CLASSPATH!"'])
当您使用/V:ON
代替!
时, %
会启用环境变量的延迟扩展。