簡體   English   中英

使用 abaqus python 2.6.2 將變量傳遞給 python 腳本文件

[英]passing variables to a python script file using abaqus python 2.6.2

我正在嘗試通過命令行將變量傳遞給abaqus腳本文件(.psf)。 每次執行另一個腳本時都會進行命令行調用,並且每次調用中的變量都有不同的值。 我可以在這方面對要使用的命令語法提供幫助嗎? 我試圖os.systemsubprocess.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

任何人都可以在這方面給予指導嗎?

試試這個。 我不確定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內核中的腳本中,請參閱我的評論

聚會很晚,但我還需要使用傳入和傳出系統的變量調用 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. stderr .write(cJob.name) #

這對我在 PyCharm 上工作,主文件中的 Py3 和“構建和執行 model.py”文件中的 Abaqus python 27。 希望對其他人也有幫助。 現在開始為 ODB 輸出創建命令!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM