【问题标题】:Get CLASSPATH constructed in a .bat file from python从 python 获取在 .bat 文件中构造的 CLASSPATH
【发布时间】:2012-01-21 23:12:53
【问题描述】:

我正在处理的 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 文件中的所有命令放入标准输出。 (将@echo off 添加到该文件对我来说不是一个选项,即我无法修改它)。抛开这个问题不谈,主要问题是%CLASSPATH% 在运行批处理文件之前被替换为它的值,这不是我想要的。

我想到的另一种方法是,如果我像上面那样创建一个Popen 对象并运行批处理文件,如果我可以访问该进程的环境,我就能得到我想要的。但从 Popen 的文档来看,这似乎是不可能的。

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

【问题讨论】:

    标签: python batch-file subprocess cmd


    【解决方案1】:

    最简单的方法是使用相关命令创建一个批处理文件。这样,在 CMD 处理相关行之前,变量不会被扩展。也可以使用@echo off 禁用回显:

    @echo off
    call mkcp.bat
    echo %CLASSPATH%
    

    然后从您的 Python 代码中调用该批处理文件。

    如果您想在没有中间批处理文件的情况下执行此操作,请尝试:

    check_output(['cmd', '/V:ON', '/c', '"@echo off && call mkcp.bat && echo !CLASSPATH!"'])
    

    /V:ON 在您使用 ! 而不是 % 进行替换时启用环境变量的延迟扩展。

    【讨论】:

    • 这太棒了。我会尽力让你知道结果。两者看起来都是非常好的解决方案。你有什么特别推荐的吗? [我失去了我的互联网,所以不能早点回来:)]。
    • 使用您喜欢的任何一个:第二个的优点是您不需要外部批处理文件,但如果您想开始使其更复杂,它会受到更多限制,例如获取多个变量。
    • 很公平。我现在正在使用第二个,非常适合我。非常感谢 :)。 (而且,我现在无法访问 Windows 机器 rt,将在星期一进行最终测试并接受这个)。 :)
    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多