8000 BUG: f2py wraps `private` entities · Issue #23879 · numpy/numpy · GitHub
[go: up one dir, main page]

Skip to content
BUG: f2py wraps private entities  #23879
Closed
@HugoMVale

Description

@HugoMVale

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0