<p>多亏了<a href="https://stackoverflow.com/users/3501546/roygvib">roygvib</a>,我们现在可以提供一个工作示例。它基于更改f2py签名文件的建议</p>
<p>假设上述问题中的代码保存在<code>sswap_ext.f95</code>中。第一步是生成签名文件:</p>
<pre class="lang-sh prettyprint-override"><code>f2py sswap_ext.f95 -m sswap_module -h sswap_ext.pyf
</code></pre>
<p>在我的例子中,生成的签名文件<code>sswap_ext.pyf</code>具有以下内容:</p>
<pre><code>! -*- f90 -*-
! Note: the context of this file is case sensitive.
python module sswap_module ! in
interface ! in :sswap_module
subroutine wrap_sswap(n,x,y,x_rows,y_rows) ! in :sswap_module:sswap_ext.f95
integer intent(in) :: n
real dimension(x_rows),intent(inout) :: x
real dimension(y_rows),intent(inout) :: y
integer, optional,check(len(x)>=x_rows),depend(x) :: x_rows=len(x)
integer, optional,check(len(y)>=y_rows),depend(y) :: y_rows=len(y)
end subroutine wrap_sswap
end interface
end python module sswap_module
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
</code></pre>
<p>现在的诀窍是用<code>sswap</code>替换每个<code>wrap_sswap</code>,并添加<code>fortranname wrap_sswap</code>,如下所示:</p>
<pre><code>! -*- f90 -*-
! Note: the context of this file is case sensitive.
python module sswap_module ! in
interface ! in :sswap_module
subroutine sswap(n,x,y,x_rows,y_rows) ! in :sswap_module:sswap_ext.f95
fortranname wrap_sswap
integer intent(in) :: n
real dimension(x_rows),intent(inout) :: x
real dimension(y_rows),intent(inout) :: y
integer, optional,check(len(x)>=x_rows),depend(x) :: x_rows=len(x)
integer, optional,check(len(y)>=y_rows),depend(y) :: y_rows=len(y)
end subroutine sswap
end interface
end python module sswap_module
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
</code></pre>
<p>现在我们可以编译:</p>
<pre class="lang-sh prettyprint-override"><code>f2py -c sswap_ext.pyf sswap_ext.f95 /path/to/blas.a
</code></pre>
<p>然后,我们可以在Python中使用<code>sswap_module.sswap</code>:</p>
<pre class="lang-py prettyprint-override"><code>>>> import sswap_module
>>> print(sswap_module.sswap.__doc__)
sswap(n,x,y,[x_rows,y_rows])
Wrapper for ``sswap``.
Parameters
n : input int
x : in/output rank-1 array('f') with bounds (x_rows)
y : in/output rank-1 array('f') with bounds (y_rows)
Other Parameters
x_rows : input int, optional
Default: len(x)
y_rows : input int, optional
Default: len(y)
>>> import numpy as np
>>> x, y = np.arange(4, dtype=np.float32), -np.arange(4, dtype=np.float32)
>>> sswap_module.sswap(2, x, y)
>>> x, y
(array([-0., -1., 2., 3.], dtype=float32), array([ 0., 1., -2., -3.], dtype=float32))
</code></pre>