fortran与x2B之间的冲突;读取名称列表时使用iso_c_绑定(通过ctypes或cython)和matplotlib[仅适用于python Anaconda!!]

fortran与x2B之间的冲突;读取名称列表时使用iso_c_绑定(通过ctypes或cython)和matplotlib[仅适用于python Anaconda!!],matplotlib,fortran,ctypes,cython,anaconda,Matplotlib,Fortran,Ctypes,Cython,Anaconda,[编辑:该问题仅适用于python anaconda,而不适用于standard/usr/bin/python2.7] [仅供参考:对任何试图将fortran与ctypes或cython结合使用的人来说仍然很有用,这要归功于] 当使用python中的fortran代码(使用iso_c_绑定)时,无论是通过ctypes还是cython,我都遇到了matplotlib的一个奇怪的不兼容问题。基本上,如果matplotlib被“激活”(通过%pylab或使用pyplot.plot命令),读取名称列表将

[编辑:该问题仅适用于python anaconda,而不适用于standard/usr/bin/python2.7]

[仅供参考:对任何试图将fortran与ctypes或cython结合使用的人来说仍然很有用,这要归功于]

当使用python中的fortran代码(使用iso_c_绑定)时,无论是通过ctypes还是cython,我都遇到了matplotlib的一个奇怪的不兼容问题。基本上,如果matplotlib被“激活”(通过%pylab或使用pyplot.plot命令),读取名称列表将忽略任何数字!!i、 e.值9.81被读取为9.00。没有matplotlib,没有问题

我做了

基本上,fortran模块只允许从名称列表中读取双精度参数g,并将其存储为全局模块变量。它还可以将其值打印为字符串,并允许直接从外部设置其值。这包括三个功能:

  • 阅读
  • 印刷品
  • 标准杆
您可以下载gist示例,然后运行:

make ctypes
python test_ctypes.py
test_ctypes.py包含:

from ctypes import CDLL, c_double
import matplotlib.pyplot as plt

f = CDLL('./lib.so')

print "Read param and print to screen"
f.read_par()
f.print_par()

# calling matplotlib's plot command seem to prevent
# subsequent namelist reading
print "Call matplotlib.pyplot's plot"
plt.plot([1,2],[3,4])

print "Print param just to be sure: everything is fine"
f.print_par()

print "But any new read will lose decimals on the way!"
f.read_par()
f.print_par()

print "Directly set parameter works fine"
f.set_par(c_double(9.81))
f.print_par()

print "But reading from namelist really does not work anymore"
f.read_par()
f.print_par()
对于输出:

Read param and print to screen
g   9.8100000000000005     
Call matplotlib.pyplot's plot
Print param just to be sure: everything is fine
g   9.8100000000000005     
But any new read will lose decimals on the way!
g   9.0000000000000000     
Directly set parameter works fine
g   9.8100000000000005     
But reading from namelist really does not work anymore
g   9.0000000000000000    
cython示例也是如此(makeclean;makeCython;pythontest\uCython.py)

是否有人知道发生了什么,或者是否有任何解决办法??我为fortran代码编写包装器的主要原因是能够处理模型、设置参数(通过名称列表)、运行它、绘制结果、设置其他参数等等。所以在我的用例中,这种bug有点违背了交互的目的

非常感谢你的提示


PS:我很高兴在某处提交一个bug,但不知道在哪里(gfortran?matplotlib?

以下是我的规范:-操作系统:Ubuntu 14.04 LTS 64位-Python 2.7.8::Anaconda 1.9.1(64位)-matplotlib v1.3.1-编译器:gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1)我无法使用64位Python 2.7.6系统和主repo(不是Anaconda)的软件包在Ubuntu 14.04中重现这个问题。你确定8号机组可以免费使用吗?@VladimirF:8236号机组仍然存在问题…@eryksun我在Anaconda外部安装了matplotlib,错误消失了…好的,谢谢你的建议。这和恼人的Ctrl+C在Anaconda的ipython中不起作用有点令人失望。。。