<p>(仅用于记录可能的第二种方法:-)</p>
<p>虽然不是严格可移植的,但另一种方法可能是使用<code>bind(C,name="sswap_")</code>,假定C导出的名称为<code>sswap_</code>(在libblas.a等中)。例如</p>
<pre><code>!! mylib.f90
module mymod
contains
subroutine sswap(n, x, y, x_rows, y_rows)
implicit none
integer, intent(in) :: n, x_rows, y_rows
real, intent(inout) :: x(x_rows), y(y_rows)
integer, save :: incx = 1, incy = 1
interface
subroutine sswap_extern(n, x, incx, y, incy) bind(C,name="sswap_")
integer :: n, incx, incy
real :: x(n), y(n)
end
end interface
call sswap_extern(n, x, incx, y, incy)
end
end module
</code></pre>
<p>我们像往常一样使用f2py:</p>
<pre><code>$ python3.8 -m numpy.f2py -c mylib.f90 -m mylib
or
$ python3.8 -m numpy.f2py -c mylib.f90 -m mylib -L/usr/local/Cellar/openblas/0.3.10_1/lib -lopenblas # on Mac + Homebrew
</code></pre>
<p>那么</p>
<pre><code>$ python3.8
>>> import mylib
>>> print( mylib.mymod.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)
>>> x, y = np.arange(4, dtype=np.float32), -np.arange(4, dtype=np.float32)
>>> mylib.mymod.sswap( 2, x, y )
>>> x
array([-0., -1., 2., 3.], dtype=float32)
>>> y
array([ 0., 1., -2., -3.], dtype=float32)
</code></pre>