1

我正在尝试abaqus通过命令行将变量传递给脚本文件(.psf)。每次执行另一个脚本时都会进行命令行调用,并且每次调用中的变量都有不同的值。我可以在这方面对要使用的命令语法有帮助吗?我试过os.systemand 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

任何人都可以在这方面给出指示吗?

4

2 回答 2

0

试试这个。我不确定 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 内核中的脚本中,请参阅我的评论

于 2015-02-27T19:23:18.117 回答
0

派对很晚,但我还需要调用 abaqus 脚本,其中传入和传出系统的变量。我的主要脚本在 Py3 中,但 Abaqus (2021) 仍在使用 Py27。只要您的模型脚本在 py27 中,您就无需担心,您仍然可以使用 Py3 调用命令。

我需要在与我的 py3 主脚本不同的目录中运行我的模型脚本,所以在主脚本中我有:

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. 标准错误.write(cJob.name) #

这对我在 PyCharm 上工作,Py3 在主文件中,Abaqus python 27 在“构建和执行 model.py”文件中。希望对其他人也有帮助。现在开始为 ODB 输出创建命令!

于 2021-11-30T15:08:33.017 回答