使用Abaqus Python 2.6.2向Python脚本文件传递变量
我想通过命令行把一个变量传递给一个abaqus
脚本文件(.psf)。每次执行另一个脚本时,都会调用这个命令行,并且每次调用时这个变量的值都不一样。请问在命令行的语法上有什么帮助吗?我试过用os.system
和subprocess.Popen
,但都出现了一些错误。
在我的主脚本(.py文件)中,它会调用这个.psf文件。
Xa=150000
abaqusCall = 'abaqus script=tt_Par.psf'
runCommand = 'cmd.exe /c ' + abaqusCall
process = subprocess.Popen(runCommand, cwd=workDir, args=Xa)
而在.psf文件中,它接受的变量格式是这样的……
import sys,os
for item in sys.argv
x1 = sys.argv[0]
x2 = sys.argv[1]
print x1,x2
有没有人能给我一些方向呢?
2 个回答
虽然来得有点晚,但我也需要在系统中调用 abaqus 脚本,并传入和传出一些变量。我的主要脚本是用 Python 3 写的,但 Abaqus(2021)还是在用 Python 2.7。只要你的模型脚本是用 Python 2.7 写的,你就不用担心,可以用 Python 3 来调用命令。
我需要在一个和我的 Python 3 主脚本不同的目录下运行我的模型脚本,所以在主脚本中我写了:
aba_dir = PATH_TO_DIRECTORY_IN_WHICH_I_WANT_ABAQUS_FILES (.odb, .cae etc.)
script_dir = DIRECTORY_FOR_MODEL_SCRIPT (build_my_model.py - this is py27 script)
job_name = call_cae(cwd, aba_dir, script_dir, var1, var2, var3)
接下来这些函数是用来构建正确命令的:
这个函数用来决定是调用 CAE 还是 ODB 查看器:
def caller_type(cae):
#DIFFERENTIATE BETWEEN CAE AND VIEWER
if cae:
caller = 'abaqus cae noGui='
else:
caller = 'abaqus viewer noGui='
return caller
这个函数用来构建带有变量的命令字符串:
def build_command_string(script, cae, *args):
# ## GET THE CAE/VIEWER CALLER
caller = caller_type(cae)
# ##CREATE STRING REPRESENTING ABAQUS COMMAND
caller = caller + script
# ##STRING ALL ARGUMENTS AS INDIVIDUAL ITEMS
str_args = [str(arg) for arg in args]
# ##CREATE COMMAND INITIALISER WITH CALLER
c = ['cmd.exe', '/C', caller, '--']
# ##APPEND STRING ARGS TO COMMAND LIST
for arg in str_args:
c.append(arg)
# ##RETURN COMMAND LIST
return c
这个函数用来把命令提交给系统,并返回作业名称:
def call_cae(cwd, aba_dir, script, *args):
# SET CAE TO TRUE
cae = True
# CHANGE TO OUTPUT DIRECTORY
os.chdir(aba_dir)
# ##BUILD COMMAND STRING
command = build_command_string(script, cae, *args)
# ##RUN SUBPROCESS COMMAND
p1 = subprocess.run(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True)
# ##RETURN TO ORIGINAL WORKING DIRECTORY (MAIN FILE)
os.chdir(cwd)
if p1.stdout == None or p1.stdout == '':
# ##RETURN JOB NAME
job_name = p1.stderr[p1.stderr.rfind('\n'):].strip('\n')
else:
# ##RETURN JOB NAME
job_name = p1.stderr[p1.stderr.rfind('\n'):].strip('\n')
# ##PRINT STATEMENT TO CHECK CONVERGANCE
print('This job exited with error')
return job_name
在我的代码中,用来构建和执行 abaqus 模型时,我指定了:
sim_num = int(sys.argv[-3]) #var1
E = float(sys.argv[-2]) #var2
nu = float(sys.argv[-1]) #var3
在我的脚本最后,我写了:
sys.stderr.write(cJob.name) #这在 PyCharm 中运行得很好,主文件用的是 Python 3,而 'build and execute model.py' 文件用的是 Abaqus 的 Python 2.7。希望这对其他人也有帮助。接下来我要开始创建 ODB 输出的命令了!
试试这个。我不太确定什么是psf文件,但我只用.py文件。
def abaqus_cmd(mycmd):
'''
used to execute abaqus commands in the windows OS console
inputs : mycmd, an abaqus command
'''
import subprocess, sys
try:
retcode = subprocess.call(mycmd,shell=True)
if retcode < 0:
print >>sys.stderr, mycmd+"...failed during execution", -retcode
else:
print >>sys.stderr, mycmd+"...success"
except OSError as e:
print >>sys.stderr, mycmd+"...failed at execution", e
要运行一个简单的命令,可以这样做。
abaqus_cmd('abaqus fetch job=beamExample')
如果想传递一个变量,可以这样做。
odbfile = 'test.odb'
abaqus_cmd('abaqus python odb_to_txt.py '+odbfile)
不过,这只是Abaqus中的一个Python实例,你在这里无法访问Abaqus的内核。要访问Abaqus的内核,你需要像这样运行脚本。
abaqus_cmd('abaqus cae noGUI=beamExample.py')
我还没有搞明白如何在Abaqus内核中将变量传递到脚本里,看看我的评论。