【问题标题】:How can I call python code from a FORTRAN Code?如何从 FORTRAN 代码中调用 python 代码?
【发布时间】:2023-03-19 04:01:01
【问题描述】:

我已经编写了一个用于在 Abaqus 中对结构进行建模的 Python 代码。我已经在命令窗口中通过abaqus cae noGUI=mycode.py 对其进行了检查(这就是调用 Abaqus 来运行该代码的方式)。它完全有效。我还在 abaqus(在 Fortran 中)编写了 UMAT 代码。我需要在UMAT 代码中调用 Python 代码。

我用st=system('abaqus cae noGUI=mycode.py')st 是一个整数。但是,没有调用python代码。我创建了一个批处理文件,我在其中写了abaqus cae noGUI=mycode.py。我在 UMAT 中通过 st=system('code.bat') 调用了该文件,我得到了 code.bat 不被识别为内部或外部命令、可运行程序或批处理文件的错误。

【问题讨论】:

  • 欢迎。请阅读介绍性tour 并阅读How to Ask。我们需要查看您的代码。
  • 是的,欢迎提供更多详细信息,因为您先验地认为您违反了使用 FORTRAN、Abaqus 和 Python 的哲学......
  • 您好,感谢您的回复。为了更详细地说明它,我需要创建一个批处理文件,它在命令窗口中执行与 abaqus cae noGUI=mycode.py 相同的任务。我只是将这一行写在一个文件中并将其保存为 .bat 文件格式。但是,它不起作用。

标签: python fortran abaqus


【解决方案1】:

当然可以从 Fortran 子例程运行 Abaqus/CAE Python 脚本,甚至调用内置的 Python 解释器。我发现它在某些极端情况下非常有用,但有一些警告。 谨慎使用

您似乎走在正确的轨道上,但是您必须记住对 Abaqus 子例程中指定的所有外部文件使用完整的文件路径。 您会发现 Abaqus 实用程序子例程 getjobnamegetoutdir 很有用。这是一个准系统示例 sn-p,其中包含一些变量定义:

use ifport, only: system, ierrno    !! Note: `USE` must come before any `INLCUDE`

character(len=256)                  :: outdir, jobname
character(len=:), allocatable       :: cwd, cmd
integer                             :: jobnamelen, outdirlen, rc, errnum

call getjobname(jobname, jobnamelen)
call getoutdir(outdir, outdirlen)
cwd = outdir(1:outdirlen)
cmd = 'abaqus cae nogui=' // cwd // '/my_script.py' 

rc = system(cmd)
if (rc .eq. -1) then
  errnum = ierrno( )
  print *, 'Error: ', errnum
endif

注意事项:

1。如果未指定完整路径,Abaqus 将假定外部文件存在/将在临时目录中创建。这通常与当前工作目录不同。

2。上面显示的代码 sn-p 使用 uexternaldb 和一个通用的“hello world”风格的 Python 脚本测试成功。

3。如果您使用的是 ifort 17 或更高版本(如果您关心的话),您还应该能够用 Fortran 2008 内在 execute_command_line 替换 ifport 可移植性函数。

4.您可以使用批处理文件,但是,批处理文件(以及批处理文件中提到的 Python 脚本)仍必须具有完整的文件路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多