我通常将我的调用包装在一个类似于这个的函数中:
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 提示符。如果还不行,你应该在谷歌上搜索如何设置文件关联。
注意:这些值是示例,应替换为您希望使用的参数。您可能还想更改批处理脚本中参数化的内容,就像我说的那样。