Closed
Description
Describe the issue:
Fortran modules can have private
and public
procedures. The first can only be accessed inside the module, the latter can be used outside.
f2py does not recognize private
procedures as such and builds wrappers for them anyway, leading to a subsequent compilation error.
The example below shows a module with one public (foo
) and one private (bar
) subroutine. The pyf file shows that f2py wrapped bar
even though this subroutine is private and cannot be accessed outside.
Reproduce the code example:
# A simple module with a public and a private subroutine
# test.f90
module test
implicit none
private
public :: foo
contains
subroutine foo(a, b)
integer, intent(in) :: a
integer, intent(out) :: b
b = a
call bar(b)
end subroutine
subroutine bar(x)
integer, intent(inout) :: x
x = 2*x
end subroutine
end module test
Error message:
# this is not the error message, but rather the content of the pyf file
# test.pyf
python module fortranmodule ! in
interface ! in :fortranmodule
module test ! in :fortranmodule:test.f90
subroutine foo(a,b) ! in :fortranmodule:test.f90:test
integer intent(in) :: a
integer intent(out) :: b
end subroutine foo
subroutine bar(x) ! in :fortranmodule:test.f90:test
integer intent(inout) :: x
end subroutine bar
end module test
end interface
end python module fortranmodule
Runtime information:
C:\Code\fortran-in-python\src\bug-f2py>f2py test.f90 -m fortranmodule -h test.pyf
Reading fortran codes...
Reading file 'test.f90' (format:free)
Post-processing...
Block: fortranmodule
Block: test
Block: foo
Block: bar
Applying post-processing hooks...
character_backward_compatibility_hook
Post-processing (stage 2)...
Block: fortranmodule
Block: unknown_interface
Block: test
Block: foo
Block: bar
Saving signatures to file ".\test.pyf"
{'attrspec': ['public']}
In: :fortranmodule:test.f90:test
vars2fortran: No typespec for argument "foo".
{'attrspec': ['private']}
In: :fortranmodule:test.f90:test
vars2fortran: No typespec for argument "bar".
C:\Code\fortran-in-python\src\bug-f2py>gfortran -c -O3 test.f90
C:\Code\fortran-in-python\src\bug-f2py>f2py -c test.pyf test.f90 --fcompiler=gnu95
running build
running config_cc
INFO: unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
INFO: unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
INFO: build_src
INFO: building extension "fortranmodule" sources
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11
INFO: f2py options: []
INFO: f2py: test.pyf
Reading fortran codes...
Reading file 'test.pyf' (format:free)
Post-processing...
Block: fortranmodule
Block: test
Block: foo
Block: bar
Applying post-processing hooks...
character_backward_compatibility_hook
Post-processing (stage 2)...
Block: fortranmodule
Block: unknown_interface
Block: test
Block: foo
Block: bar
Building modules...
Building module "fortranmodule"...
Constructing F90 module support for "test"...
Constructing wrapper function "test.foo"...
b = foo(a)
Constructing wrapper function "test.bar"...
bar(x)
Wrote C/API module "fortranmodule" to file "C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodulemodule.c"
Fortran 90 wrappers are saved to "C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.f90"
INFO: adding 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranobject.c' to sources.
INFO: adding 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11' to include_dirs.
copying C:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\f2py\src\fortranobject.c -> C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11
copying C:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\f2py\src\fortranobject.h -> C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11
INFO: adding 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.f90' to sources.
INFO: build_src: building npy-pkg config files
C:\Code\fortran-in-python\.venv\Lib\site-packages\setuptools\command\install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
running build_ext
INFO: No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
INFO: customize MSVCCompiler
INFO: customize MSVCCompiler using build_ext
INFO: customize Gnu95FCompiler
INFO: Found executable C:\msys64\mingw64\bin\gfortran.exe
INFO: customize Gnu95FCompiler using build_ext
INFO: building 'fortranmodule' extension
INFO: compiling C sources
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp\tmp7f0jvx1p
creating C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11
INFO: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\HostX86\x64\cl.exe /c /nologo /O2 /W3 /GL /DNDEBUG /MD -DNPY_DISABLE_OPTIMIZATION=1 -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11 -IC:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\core\include -IC:\Code\fortran-in-python\.venv\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\Include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\ATLMFC\include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\um -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\shared -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\winrt -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\cppwinrt /TcC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodulemodule.c /FoC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodulemodule.obj
INFO: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\HostX86\x64\cl.exe /c /nologo /O2 /W3 /GL /DNDEBUG /MD -DNPY_DISABLE_OPTIMIZATION=1 -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11 -IC:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\core\include -IC:\Code\fortran-in-python\.venv\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\Include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\ATLMFC\include -IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include -IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\um -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\shared -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\winrt -IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\cppwinrt /TcC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranobject.c /FoC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranobject.obj
INFO: compiling Fortran 90 module sources
INFO: Fortran f77 compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -ffixed-form -fno-second-underscore -O3 -funroll-loops
Fortran f90 compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -fno-second-underscore -O3 -funroll-loops
Fortran fix compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -O3 -funroll-loops
INFO: compile options: '-IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11 -IC:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\core\include -IC:\Code\fortran-in-python\.venv\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\Include -c'
extra options: '-JC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\ -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\'
INFO: gfortran.exe:f90: test.f90
f951.exe: Warning: Nonexistent include directory 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\' [-Wmissing-include-dirs]
f951.exe: Warning: Nonexistent include directory 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\' [-Wmissing-include-dirs]
INFO: compiling Fortran sources
INFO: Fortran f77 compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -ffixed-form -fno-second-underscore -O3 -funroll-loops
Fortran f90 compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -fno-second-underscore -O3 -funroll-loops
Fortran fix compiler: C:\msys64\mingw64\bin\gfortran.exe -Wall -g -ffixed-form -fno-second-underscore -Wall -g -fno-second-underscore -O3 -funroll-loops
INFO: compile options: '-IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11 -IC:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\core\include -IC:\Code\fortran-in-python\.venv\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\Include -c'
extra options: '-JC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\ -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\'
INFO: gfortran.exe:f90: C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.f90
f951.exe: Warning: Nonexistent include directory 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\' [-Wmissing-include-dirs]
f951.exe: Warning: Nonexistent include directory 'C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\' [-Wmissing-include-dirs]
C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.f90:8:22:
8 | use test, only : bar
| 1
Error: Symbol 'bar' referenced at (1) not found in module 'test'
error: Command "C:\msys64\mingw64\bin\gfortran.exe -Wall -g -fno-second-underscore -O3 -funroll-loops -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11 -IC:\Code\fortran-in-python\.venv\Lib\site-packages\numpy\core\include -IC:\Code\fortran-in-python\.venv\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\include -IC:\Users\myname\.pyenv\pyenv-win\versions\3.11.2\Include -c -c C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.f90 -o C:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\src.win-amd64-3.11\fortranmodule-f2pywrappers2.o -JC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\ -IC:\Users\myname\AppData\Local\Temp\tmp7f0jvx1p\Release\" failed with exit status 1
Context for the issue:
No response