从python代码运行等效的批处理文件命令

从python代码运行等效的批处理文件命令,python,windows,batch-file,cmd,intel-fortran,Python,Windows,Batch File,Cmd,Intel Fortran,我有这个批处理文件(abaqusjob.bat): 我想从等效的python代码运行它,例如使用Popen,而不是运行批处理文件本身,因为我想自动更改最后一行中的一些参数 有什么想法吗?我通常将我的调用封装在一个类似于以下函数的函数中: def issue_command(command): process = Popen(command, stdout=PIPE, stderr=PIPE, shell=True) return process.communicate() 然后

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

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


有什么想法吗?

我通常将我的调用封装在一个类似于以下函数的函数中:

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(请参阅)会存在安全问题,这似乎不适用于您的问题,但您没有说明从何处获取不同参数集的数据

如果不使用“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")
使用这样的签名的好处可以在这里找到:

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

@echo off
@call ifortvars.bat intel64
cd c:\ABAQUS_Jobs
abaqus job=%1 user=%2 cpus=%3 gpus=%4 interactive
将允许您分别指定作业、用户、CPU和GPU。然后使用上述函数在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提示符。如果这还不行,你应该在谷歌上搜索如何建立文件关联


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

谢谢!我只是有一个问题:当您编写
发出_命令(“c:\ABAQUS_Jobs\abaqusjob.bat job=…”)
时,您要求系统运行bat文件,然后运行ABAQUS命令?如果是的话,我不明白它是做什么的,因为运行bat文件可以一次性运行所有东西(所以不需要编写abaqus行?)。希望你能明白我的问题。也许我误解了这个问题。您说过要通过更改最后一行上的参数来运行该命令,所以我假设您将参数化最后一行。您希望将批处理脚本转换为python,还是希望更改批处理脚本以接受参数,以便可以使用不同的参数重复调用批处理脚本。当你回答时,我会更新答案,包括你想要的。任何一种方式都适合我。我没有偏好。作为附加要求,我只需要在命令完成后关闭cmd窗口。这就是我的批处理文件的现状。最好是我可以在python中更改
CPU
编号或
job
名称。那么,如果bat文件被相应地更改,或者所有命令都在python中运行(尽管后者是我的问题),这对我来说是无关紧要的。谢谢这个新编辑对你有用吗?如果是这样,你可能会考虑接受这个答案,如果不是,我会非常乐意再次帮助。\R是一个转义序列,意思是回车。这是你的第一个论点。要解决这个问题,您可以使用“C:\Users\jandre\Desktop\\rel2.bat”或使用pythonic版本os.path.join(“C:”、“Users”、“jandre”、“Desktop”、“rel2.bat”),它将为您处理所有转义和跨平台问题。
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)