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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
HugoMVale opened this issue Jun 5, 2023 · 2 comments · Fixed by #23971
Closed

BUG: f2py wraps private entities #23879

HugoMVale opened this issue Jun 5, 2023 · 2 comments · Fixed by #23971

Comments

@HugoMVale
Copy link

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

@HugoMVale HugoMVale changed the title f2py does respect private entities f2py wraps private entities Jun 5, 2023
@HugoMVale HugoMVale changed the title f2py wraps private entities BUG: f2py wraps private entities Jun 6, 2023
@HugoMVale
Copy link
Author

Sorry for addressing you directly @HaoZeke, but since you solved #23598, I was wondering if you could have a look at this issue as well. Thanks.

@HaoZeke
Copy link
Member
HaoZeke commented Jun 17, 2023

Sorry for addressing you directly @HaoZeke, but since you solved #23598, I was wondering if you could have a look at this issue as well. Thanks.

No problem! sorry this fell by the wayside, will look into it over the weekend :)

HaoZeke added a commit to HaoZeke/numpy that referenced this issue Jun 17, 2023
By adding them to skipfuncs
HaoZeke added a commit to HaoZeke/numpy that referenced this issue Jun 17, 2023
charris pushed a commit to charris/numpy that referenced this issue Jul 6, 2023
By adding them to skipfuncs
charris pushed a commit to charris/numpy that referenced this issue Jul 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants
0