Python:通过子进程调用Fortran并通过communicate发送命令

1 投票
1 回答
944 浏览
提问于 2025-04-17 03:51

我想从Python调用一个Fortran程序。我使用了subprocess里的Popen语句,像这样:

p = Popen(['./finput'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

接着,我想把一些文件名发送给Fortran程序。这个Fortran程序会从标准输入(stdin)读取这些文件名,然后打开文件。如果我使用类似这样的代码:

p_stdout = p.communicate(input='file1.dat\nfile2.dat\n')[0]

一切都很正常,Fortran程序按预期工作。不过,我想从Python程序内部把文件名作为变量传给它。所以如果我用:

p_stdout = p.communicate(input=file1+'\n'+file2+'\n')[0]

我的Fortran程序就无法打开这些文件名。问题在于Fortran读取的字符串看起来像这样:

 f i l e 1 . d a t

第一个字符是个空格,中间每个正确字符之间都有一些奇怪的字符。不幸的是,这些奇怪的字符只有在你逐个打印字符串的每个字符时才会显示出来。如果你只是用下面的代码打印文件名:

print*,file1

你得到的结果是:

file1.dat

所以我的问题是,为什么Python在与子进程的通信中加入了这些奇怪的字符,更重要的是,我该如何去掉它们呢?

1 个回答

2

听起来你的Fortran可能在处理Unicode字符,你是在用Python 3吗?如果是的话,那你可以先构造好要传递的字符串,然后使用 string.encode() 来进行编码。

撰写回答