我过去曾成功使用该subprocess
模块,但是,我一直在努力将 Fortran 可执行文件传递给参数。
它适用于命令行:.\IMT.EXE path\to\file
很好。但是当我尝试使用 subprocess 模块向它传递完全相同的参数时,
subprocess.call(['.\IMT.EXE', file_path])
IMT 告诉我输入的文件无效。不幸的是,IMT 不会输出无效的文件名,这使得调试变得困难。我知道文件在那里,我知道正在向 IMT 传递一个参数,但由于某种原因,该字符串没有被正确传递。我目前正在gcc
cygwin 上下载,这样我至少可以尝试打印无效的文件名(尽管我以前从未编写过 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的
- 蟒蛇 3.3
- IMT 是用 Fortran90 编写的
- 我有 IMT 源代码,但对 Fortran 一无所知。
我已经查看了关于该模块的其他帖子,subprocess
但没有一个有帮助。
编辑:
所以我终于让它工作了。问题不在于不正确地处理反斜杠,而是我假设在IMT.EXE
打开子进程时它会将其目录视为当前工作目录。它不是。我在调用 IMT: 时应该更清楚,subprocess.call([os.path.join('imt', 'IMT.EXE'), file_path])
并且只作为文件名传递file_path
,因为它存在于 directory 中imt
。对困惑感到抱歉。