【问题标题】:creating distributable windows python module with f2py使用 f2py 创建可分发的 windows python 模块
【发布时间】:2012-04-03 02:44:49
【问题描述】:

我用 python 和 f2py 编写了一些代码,主要是使用 linux。这一切都很好,但现在我想与 Windows 用户分享它,所以我正在尝试制作一个可分发给不一定有 gfortran 或 gcc 的用户的模块。我可以访问 windows xp 盒子,正在使用 mingw 和 gfortran。我可以在该机器上编译和使用该模块,但在其他机器上创建的 pyd 似乎需要 dll 的 libgcc 和 libgfortran。以下是来自http://www.scipy.org/F2PY_Windows 的示例:

subroutine hello ()
   write(*,*)'Hello from Fortran90!!!'
end subroutine hello

编译

python c:\path\to\python\scripts\f2py.py -c \
       --fcompiler=gnu95 --compiler=mingw32 \
        -lmsvcr71 -m foo foo.f90

这在我编译它的机器上按预期工作,但是如果我将它复制到另一台机器上,我会得到

DLL load failed: The specified module could not be found.

使用依赖walker,我发现它找不到libgcc_s_dw2-1.dll 和libgfortran-3.dll 的dll。是否可以在不假设用户拥有 gcc 和 gfortran 的情况下创建一个我可以分发的 pyd?我在两台机器上都使用 python2.7,都是 32 位的。一个是xp,另一个是windows 7。

【问题讨论】:

  • 为什么不使用 pyd 重新分发 mingw 的 libgcc_s_dw2-1.dll 和 libgfortran-3.dll?
  • 好吧,最终我想使用 setup.py 为模块构建二进制文件。我不知道如何将 dll 添加到二进制文件中。
  • 使用 distutils package_data 或 data_files (docs.python.org/distutils/setupscript.html)
  • 好的,我认为我的问题是我使用的编译器。如果不使用 mingw 编译器,而是从 link 下载 gfortran 并首先确保它在您的路径中,然后编译它似乎可以正常工作。这几乎是link 上的说明,所以如果我正确阅读了它就会起作用。

标签: python windows gfortran f2py


【解决方案1】:

作为在包中包含libgcclibgfortran dll 的替代方案,应该可以链接到这些库的静态版本,前提是它们在您的MinGW 构建中可用。 (至少,我认为是。我没有使用 Python 或 pyds 的经验,但对于常规的可执行文件和 dll 来说是可能的。)

查看-static 链接选项,或者如果您需要更多控制-static-libgcc-static-libgfortran

【讨论】:

  • 这是我成功的方法。 MinGW gcc(带有 gfortran)默认使用共享库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多