使用参数在Python中执行Fortran子进程

时间:2012-12-12 14:55:54

标签: python subprocess fortran90

我过去使用subprocess模块取得了成功,但是,我一直在努力将Fortran可执行文件作为参数传递。

它适用于命令行:.\IMT.EXE path\to\file就好了。但是当我尝试使用子进程模块传递完全相同的参数时,

subprocess.call(['.\IMT.EXE', file_path])

IMT告诉我输入的文件无效。不幸的是,IMT不输出无效的文件名,这使调试变得困难。我知道文件在那里,我知道IMT正在传递一个参数,但由于某种原因,字符串没有被正确传递。我目前正在cygwin上下载gcc,这样我至少可以尝试打印无效的文件名(虽然我以前从未写过fortran)。

我尝试过的其他事情没有成功: 这个只是挂起而什么都不做。

p = subprocess.Popen(['.\IMT.EXE'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result = p.communicate(file_path.encode())

或者这个只打印出Output:然后什么都没有。

p.stdin.write(temp_i_name.encode())
p.kill()
print('Output: ', p.stdout.read().decode())

虽然我不相信它会有所帮助(但事实并非如此),我也尝试设置shell=True

我也试过os.system

os.system('.\IMT.EXE' + ' ' + file_path)

同样的错误:

Input Error.
Command line argument for Inverse Modeling Toolkit must
be valid path and filename of instruction file.

其他相关信息:

  • Windows 7
  • Python 3.3
  • IMT是用Fortran90编写的
  • 我有IMT源代码,但对Fortran一无所知。

我已经查看过有关subprocess模块的其他帖子,但没有人帮助过。

编辑:

所以我终于让它运转了。问题不是不正确地处理反斜杠,而是我假设在打开子进程IMT.EXE时它会将其目录视为当前工作目录。它不是。当我调用IMT时,我应该更加清楚:subprocess.call([os.path.join('imt', 'IMT.EXE'), file_path])并且只传递file_path作为文件的名称,因为它存在于目录imt中。对不起,感到困惑。

1 个答案:

答案 0 :(得分:1)

我的猜测是,你错误地传递了文件名。例如,你正确地逃避反斜杠?你说你在调用这个程序之前写了这个文件,你还记得刷新文件,实际上它是物理上在磁盘上吗?

您能告诉我们您如何定义文件名吗?

另一个选项:在调用外部进程之前立即添加pdb断点。当脚本在此时停止时,打开另一个窗口并查看该文件是否存在。