Abaqus脚本升级:From Python 2 to Python 3
您是否在Abaqus2024版本中运行Python脚本时遇到问题?可能是的。也许您已经知道,我们必须在Abaqus2024中从Python2升级到Python3。从Abaqus2024开始,CAE中的Python版本是3.10!这是一个期待已久的更新(从Python2.7到3.10),它增加了FEA的更多可能性,并将模拟工作流程推向新的极限。从现在开始,我们可以利用Python2.7中不可用的许多Python3.10功能,例如:f字符串、数据类、模式匹配、数据类型、更好的错误消息、更轻松的调试、性能改进等等。此重要更新可能需要您更新“旧”Python脚本。虽然听起来很麻烦,但在大多数情况下,如果有必要的话,改变会很小。Abaqus2024在Python环境方面引入了重大更新。从现在开始,Abaqus将Python2.7抛在一边,Python3.10崛起!“我可以像以前一样使用Python2.7脚本和插件吗?”我建议您在Abaqus2024中尝试脚本并评估它们是否仍然有效。尽管更新听起来像是一个巨大的变化,但实际上并非如此,并且您的许多脚本可能仍然可以正常工作。但…“如果我的旧Python2.7脚本无法在Abaqus2024中运行怎么办?”1、有两个方法来升级Python脚本。1.1.自动升级您的脚本Abaqus提供了一个转换工具,可以自动将脚本从Python2.7升级到Python3。该实用程序(abqPy2to3)可以从Abaqus/CAE或命令行执行。我们可以从目录中批量升级脚本,也可以选择单个文件。例如,在图中,我正在将脚本从Abaqus2019升级到Abaqus2024,并且我将保留原始文件的备份。升级之前,我们可以在浏览器上“预览更改”:就我而言,唯一改变的行解决了zip函数的问题。在Python3.10中,zip函数不返回列表,而是返回“可迭代”对象。这就是升级程序实用程序在我的脚本中进行更改的原因,将可迭代对象显式转换为列表。检查更改后,我们可以单击“升级脚本”,就是这样!注意:会弹出一个带有日志信息的辅助窗口,其中包含进程的详细信息和备份文件的名称。在我看来,通过预览运行此自动升级程序是了解Python脚本中最相关更改的最佳方式:>>abaquspython-mabqPy2to3<files/directories>请注意,“abaqus”命令取决于您的Abaqus2024设置(例如abq2024、abq24...)。此命令接受文件列表或目录列表(相对或绝对路径)。在后一种情况下,它将递归遍历所有子文件夹寻找Python文件(带有'py'扩展名)。在极少数情况下,自动升级实用程序可能无法按预期工作。例如,在涉及其他模块或库的复杂脚本中。这些Python程序需要用户进行一些手动干预。1.2.手动升级您的脚本在极少数情况下,自动升级实用程序可能无法按预期工作。例如,在涉及其他模块或库的复杂脚本中。这些Python程序需要用户进行一些手动干预。根据我的经验,将脚本从Python2升级到Python3.10最常见的更改如下:print语句已被弃用,取而代之的是print作为函数。Python#Python2acceptsbothformsprint'HelloWorld!'#printstatementprint('HelloWorld!')#printfunction#Python3onlyacceptsprintasafunctionprint('HelloWorld!')复制zip或dict.keys和dict.values等函数返回Python#Somedatapx=[0.0,0.5,1.0]py=[0.2,0.6,1.0]#===Python2===points=zip(px,py)#List:[(0.0,0.2),(0.5,0.6),(1.0,1.0)]p1=points[0]#Indexlistp1,p2,p3=points#Unpackinglistforx,yinpoints:#Iteratethroughthelistpass#===Python3===points=zip(px,py)#Iterable:[(0.0,0.2),(0.5,0.6),(1.0,1.0)]#p1=points[0]#IndexingisNOTallowediniterablesp1=list(points)[0]#Workaround:converttolist#p1,p2,p3=points#UnpackingiterableisNOTallowedp1,p2,p3=list(points)#Workaround:converttolistforx,yinpoints:#IteratingisallowediniterablespassPython3中的整数除法用//表示。整数(a/b)之间的常规除法总是会产生浮点数!请看下面代码片段中的第一个示例。Python#===Python2===print(8/3)#Output:2print(8./3)#Output:2.66666666666667print(8.//3)#Output:2.0#===Python3===print(8/3)#Output:2.66666666666667print(8./3)#Output:2.66666666666667print(8.//3)#Output:2.02.在Abaqus2024中使用Python3如果我们将Python3.10与Python2.7进行比较,我们会发现一些新功能将使我们的脚本更加实用和可读!从Python3.6开始,我们可以使用所谓的f-strings。F字符串有助于通过{}占位符将变量包含到字符串中。代码片段中查看f字符串的强大功能和灵活性。Python#Example1-Basicusagename='Peter'hello=f'Hello{name}!'print(hello)#Output:HelloPeter!#Example2-Formatfloatsfrommathimportpiprint(f'pi={pi:f.6}')#Output:pi=3.141596#Example3-Inlineoperationssome_numbers=[2,4,8,16]print(f'Thelistcontains{len(some_numbers)}items')#Output:Thelistcontains4items#Example4-Debuggingvariablesquickvar1=10var2=4var3=Falsevar4=-1e6print(f'{var1=}')print(f'{var1+var2=}')print(f'{var3=},{var4=:g}')#Output:var1=10#var1+var2=14#var3=False,var4=-1e+06#Example5-Sometrickswithstringstitle='Results'print(f'{title:20}:')print(f'{title:^20}:')print(f'{title:-^20}:')#Output:Results:#Results:#------Results-------:#---Endoffile---类型提示这个话题对于Python用户来说听起来有点麻烦,因为Python是一种动态类型语言。这是否意味着我们从现在开始就必须指定数据类型?并不是这样的,我们不必这样做,但我们现在有这个选择。为什么我们要声明变量的类型或函数的参数和输出?声明数据类型(类型提示)有几个原因:调试。发现一些错误变得更加容易。可读性和文档。如果我们读取函数所需的数据类型,就会更容易理解该函数的要求并追踪潜在的错误。改进IDE和linting。如果您在PyCharm、VSCode或类似工具中进行编码,那么在使用类型提示时IDE将更加有帮助且响应更快。写作前要三思。类型提示迫使您提前考虑您的程序:涉及的数据类型、功能方面(重载方法、多个返回类型)等。Python#Typehintinginafunctiondefmyfunction(x:int)->str:returnf"Message:{x+5}"#Typehintingofavariablevar:int=10print(myfunction(var))#Output:Message:15数据类如果您通过实现和使用自己的类来进行面向对象编程(OOP),那么您将会喜欢数据类。数据类就是这样一个类,专门用于表示:Data。数据类提供了简化对象创建的特定功能,例如:默认值、数据的直接表示(__repr__)、属性初始化、数据保护(冻结)等等。在下面的代码片段中,您可以看到一些正在发挥作用的主要功能。Python#Importrequired(decorator)fromdataclassesimportdataclass#Declarationofthedataclass@dataclassclassimportedPart:file:strdims:int=3#defaultvalueis3(3D)info:str=""#defaultvalueisempty#Createobjectmypart=importedPart(R"C:\CAD\bolt_M3x40.stp",3,"BoltM3x40")print(mypart)#Output:importedPart(file='C:\\CAD\\bolt_M3x40.stp',dims=3,info='BoltM3x40')结构模式匹配如果要使用某种switch-case语句,这将改变游戏规则。到目前为止,我们一直在Python中使用if-else语句,直到……Python3.10!结构模式匹配解决了Python中的这一缺陷,而且确实做到了!Python#Optionwrittenbytheuseroption='new'#Structuralpatternmatchingmatchoption:case'new':print('Creatingnewfile')case'save':print('Savingcurrentfile')caseother:print('Unknowncommand:{other}')#Output:Creatingnewfile还有更复杂的选项:Python#Optionwrittenbytheuseroption='openbolted_joint_4x3_M12'#Structuralpatternmatchingmatchoption.split():case['new',filename]:print(f'Creatingnewfile:{filename}')case['open',filename]:print(f'Openingfile:{filename}')case['quit'|'close']:#Matches['quit',]or['close',]print('Byebye!')case_:#Matchesanythingelseprint(f'Unknowncommand:{option!r}')#Output:Openingfile:bolted_joint_4x3_M12通过使用类作为匹配模式、可变数量的参数,结构模式匹配更进一步。正如我们所看到的,Abaqus2024中引入的Python3.10涉及我们的Python脚本中的一些重要更改。如有必要,我们必须对其进行测试和升级。然而,此更新为Abaqus的现代Python脚本开发带来了更多优势,Abaqus现在可以导入pandas、pytorch等新功能包。来源:ABAQUS仿真世界