5

同じ abaqus .inp ファイル (実行内でわずかに変更) を複数回実行する必要があり、各実行が終了したら、結果を読み取る abaqus python スクリプトを送信する必要があります。

私は次のことをしました:

#run the programme
os.system('abaqus job=file_name cpus=2')

#get results and write them to myresults.txt
os.system('abaqus viewer noGUI=python_name.py')

ただし、メインプログラムは、1 行目で開始されたプログラムが終了する前に 2 行目を実行します。その結果、エラーが発生します。どうすればこれを解決できますか?

4

7 に答える 7

7

ここでの問題は、サブプロセスの待機に関するものではなく (実際に待機している)、ソルバーの実行後、Abaqus がいくつかの一時ファイルを削除して ODB を閉じるのに数秒かかるという事実だと思います。次のいずれかをお勧めします。

  • @glenn_gouldが提案したように、「インタラクティブ」を使用してコマンドラインからソルバーを実行します

    strCommandLine = 'abaqus interactive job=jobname'  
    subprocess.call(strCommandLine)
    
  • abaqus python スクリプトを実行する

    strCommandLine = 'abaqus python ScriptToRun.py -- (jobname)'  
    subprocess.call(strCommandLine)
    

    ScriptToRun.py内では、@elluminiが提案したようにwaitForCompletion()を使用します

    from abaqus import *
    import job
    import sys
    
    jobname = mdb.JobFromInputFile(sys.argv[-1], sys.argv[-1]+".inp") 
    jobname.submit() 
    jobname.waitForCompletion()
    
  • 次のように、ファイル jobname.023 または jobname.lck が存在する間に実行するには、try ステートメントを使用します。

    strCommandLine = 'abaqus job=jobname'  
    subprocess.call(strCommandLine)
    
    while os.path.isfile('jobname.023') == True:
        sleep(0.1)
    

これは、この壮大なコミュニティでの私の最初の投稿でした。

于 2015-05-07T21:14:38.650 に答える
3

system('abaqus job=inputfile.inp interactive') が必要だと思います

interactive は、abaqus の実行が終了するまで、システム コマンドが終了したとは見なしません。

インタラクティブな abaqus がなければ、システム コマンドが終了し、次のコマンドに移動している間、バックグラウンドで実行されますが、これは望ましくありません。

于 2014-06-06T20:20:51.700 に答える
1

バックグラウンドでの実行についてですが、本当にそうですか?

このサイトはos.system('abaqus job=file_name cpus=2')、それがフォアグラウンドで実行されることを示唆しています。

バッチ モードでの Abaqus の使用 Abaqus システムをバッチ モードで呼び出すには、Abaqus > コマンドでファイル名を指定する必要があります。たとえば、myProg.inp を実行する場合:

abaqus job=myProg

(ファイル名の後に拡張子を付けないでください)

このコマンドは、Abaqus をバッチ モードで開始する必要があります。このコマンドは、プログラムをフォアグラウンドで実行します。プログラムをバックグラウンドで実行する場合は、コマンドの末尾にアンパサンドを追加します。

abaqus job=myProg &

バックグラウンド処理を強制しているローカル構成設定が存在する可能性がありますか? もしそうなら、おそらくスイッチを追加して、処理がフォアグラウンドにあることを確認できます。

于 2012-03-11T20:30:15.787 に答える
1

すでに適切な解決策を見つけたかどうかはわかりませんが、ジョブ オブジェクト:

Jobxy.waitForCompletion() 

ジョブの完了を待ってから、pyhton スクリプトの実行を続行します。たとえば、後処理に関するコマンドを使用します。詳細については、abaqus スクリプトのユーザー マニュアルを参照してください...

于 2015-03-03T16:58:57.513 に答える
1

subprocessモジュールを見てください。メソッドはcall、プロセスが完了するまで待機します。を使用するよりも、子プロセスをより適切に制御することもできますos.system()

于 2012-03-11T19:54:18.367 に答える
1

subprocess モジュールは、別の回答で推奨されています。これは、これを行うために公式に推奨される方法です。ただし、より迅速で簡単な方法 (Python 3 では非推奨ですが、2.x でも問題なく動作するため、考慮してください) はコマンドモジュールです。

import commands
(return_code, output) = commands.getstatusoutput('abaqus job=file_name cpus=2')
于 2012-03-11T20:02:20.433 に答える
0

os.call オプションを指定せずにsubprocessを使用してみてください。この方法を使用して、バックグラウンドで Abaqus を実行できます。

import subprocess
path = location of file in any directory 
abaqusCall = 'abaqus job=file_name cpus=2'
runCommand = 'cmd.exe /c ' + abaqusCall
process = subprocess.Popen(runCommand, cwd=path)

Abaqus の問題は、解析の実行に時間がかかることです。そのため、結果を取得するために「python_name.py」ファイルを実行しようとすると、*.odb ファイルが実行されていないため、プログラムでエラーが発生する可能性があります。まだ作成されていないか、抽出が必要なデータが含まれていません。

次のコマンドを使用できます。

process.wait()

Python に、「python_name.py」を実行する前に Abaqus が解析を終了するのを待つように指示しますが、これにより、Abaqus が完了するまで Python コマンド (または GUI) がハングし、時間がかかります。

私が使用する 1 つの方法は、解析時間と進行状況を含む Abaqus から *.sta ファイルを読み取ることです。したがって、たとえば 5 秒ごとにファイルを読み取るシーケンスを記述し、結果抽出ファイルを実行する前にジョブが終了するタイミングを監視できます。

データ抽出のもう 1 つのトリックは、CAE モジュールからクラスを使用 (インポート) しない限り、次のコマンドを使用して Python スクリプトを実行できることです。

#get results and write them to myresults.txt
os.system('abaqus python python_name.py')
于 2012-06-14T20:34:39.097 に答える