从python获取.bat文件中构造的CLASSPATH

时间:2011-12-16 12:10:50

标签: python batch-file subprocess cmd

我正在处理的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的文档来看,这看起来并不可能。

关于如何实现这一目标的任何想法?

1 个答案:

答案 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代替!时,

%会启用环境变量的延迟扩展。