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

标签 python subprocess fortran90

我过去曾成功使用 subprocess 模块,但是,我一直在努力向 Fortran 可执行文件传递参数。

它在命令行上工作:.\IMT.EXE path\to\file 就好了。但是当我尝试使用 subprocess 模块向它传递完全相同的参数时,

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 一无所知。

我查看了 SO 上关于 subprocess 模块的其他帖子,但都没有帮助。

编辑:

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

最佳答案

我的猜测是,您传递的文件名不正确。例如,您是否正确地转义了反斜杠?你说你在调用这个程序之前写了文件,你是否记得刷新文件以便它实际上物理地在磁盘上?

你能告诉我们你是如何定义文件名的吗?

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

关于python - 使用参数在 Python 中执行 Fortran 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842383/

相关文章:

python - 在pygame中将矩形转换为曲面

python - 比较具有相同元素且顺序相同的列表?

linux - python 将 os.environ 传递给子 gnome 终端

function - 在 Fortran90 的同一模块中调用函数

arrays - fortran 中的数组数组

fortran - 在fortran 90中打开并读取一行数据

python - 网络音频播放器需要一些时间才能播放歌曲

python - TypeError:setText(self,str):参数1具有意外类型 'tuple'

python - Python subprocess.run无法处理大参数字符串

Python 在 Windows 上发送 SIGINT 信号子进程