【问题标题】:Run equivalent batch file commands from python code从 python 代码运行等效的批处理文件命令
【发布时间】:2014-06-10 10:48:09
【问题描述】:

我有这个批处理文件(abaqusjob.bat):

@echo off
@call ifortvars.bat intel64
cd c:\ABAQUS_Jobs
abaqus job=Australian2g1065fmpc user=routinem2mpc8f8el cpus=8 gpus=1 interactive

我想从等效的 python 代码运行它,例如使用Popen,而不是运行批处理文件本身,因为我想自动更改最后一行中的一些参数。

有什么想法吗?

【问题讨论】:

    标签: python windows batch-file cmd intel-fortran


    【解决方案1】:

    我通常将我的调用包装在一个类似于这个的函数中:

    def issue_command(command):
        process = Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
        return process.communicate()
    

    然后你可以像这样调用函数:

    stdout, stderr = issue_command("c:\ABAQUS_Jobs\abaqusjob.bat job=...")
    

    然而,使用带有不受信任的输入的 shell=True 存在安全问题(请参阅https://docs.python.org/2/library/subprocess.html#frequently-used-arguments),这似乎不适用于您的问题,但您没有说明您从哪里获取不同组的数据论据。

    如果您不使用“shell=True”,那么您必须明确说明路径和其他一些内容(请参阅上面链接中警告上方的段落)。

    您可能还想考虑使用更复杂的函数

    def issue_command(*args):
        process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)
        return process.communicate()
    

    会这样调用:

    stdout, stderr = issue_command("c:\ABAQUS_Jobs\abaqusjob.bat", "job=Australian2g1065fmpc", "user=routinem2mpc8f8el")
    

    使用这样的签名的好处可以在这里找到:https://docs.python.org/2/library/subprocess.html#popen-constructor

    编辑: 既然您说这两种方式都可以,我将选择使用批处理脚本,因为我不知道您使用“ifortvars.bat”设置什么样的环境。因此,对于批处理脚本中的参数,您使用 %n 其中 n 是参数的索引。因此:

    @echo off
    @call ifortvars.bat intel64
    cd c:\ABAQUS_Jobs
    abaqus job=%1 user=%2 cpus=%3 gpus=%4 interactive
    

    将允许您分别指定作业、用户、cpus 和 gpus。然后很容易在python中使用上面描述的函数调用这个。

    def issue_command(*args):
        process = Popen(args, stdout=PIPE, stderr=PIPE, shell=True)
        return process.communicate()
    
    args = [["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian2fmpc", "routinem2", "8", "1"],
            ["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian3fmpc", "routinem3", "4", "2"],
            ["c:\ABAQUS_Jobs\abaqusjob.bat", "Australian4fmpc", "routinem4", "5", "3"]]
    
    for arg in args:
        out, err = issue_command(*arg)
    

    我认为这应该可以解决您的问题,但我现在在平板电脑上,所以如果有错误,请在下面告诉我,我会尽快修复。此外,您的新要求应该很容易,只要您的 python 安装更新了您的注册表(它应该有),您所要做的就是双击 .py 文件,它应该运行并在完成后关闭 cmd 提示符。如果还不行,你应该在谷歌上搜索如何设置文件关联。

    注意:这些值是示例,应替换为您希望使用的参数。您可能还想更改批处理脚本中参数化的内容,就像我说的那样。

    【讨论】:

    • 谢谢!我只是有一个问题:当您编写issue_command("c:\ABAQUS_Jobs\abaqusjob.bat job=...") 时,您是在要求系统运行 bat 文件,然后运行 ​​abaqus 命令?如果是,我不明白它的作用,因为运行 bat 文件会一次性运行所有内容(所以不需要编写 abaqus 行?)。希望我的问题对你来说很清楚。
    • 也许我误解了这个问题。你说你想通过改变最后一行的参数来运行命令,所以我假设你会参数化最后一行。你想将你的批处理脚本翻译成 python 还是你想改变你的批处理脚本来接受参数,这样你就可以用不同的参数重复调用你的批处理脚本。当您回答时,我会更新答案以包含您想要的内容。
    • 任何一种方式对我来说都可以。我没有偏好。作为附加要求,我只需要在命令完成后关闭 cmd 窗口。这就是我的批处理文件所发生的情况。最好是我可以在 python 中更改 cpus 数字或 job 名称。如果 bat 文件相应地更改或所有命令都在 python 中运行(尽管后者是我的问题),那么对我来说是无所谓的。谢谢!!!
    • 这个新的编辑对你有用吗?如果是这样,您可能会考虑接受答案,如果不是,我将非常乐意再次提供帮助。
    • \r 是转义序列,表示回车。这存在于您的第一个论点中。要解决这个问题,您可以使用 "C:\Users\jandre\Desktop\\rel2.bat" 或使用 pythonic 版本 os.path.join("C:", "Users", "jandre", "Desktop" , "rel2.bat") 将为您处理所有转义和跨平台问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多