f2pyμ λ¬Έμ / μ¬μ©μ κ°μ΄λμ λ°λΌ νμ₯ λͺ¨λμ΄μλ .c
νμΌμ μμ±νλ €λ©΄ λ°λμ μνν΄μΌν©λλ€.
$ f2py -m fib1 fib1.f
fib1module.c
νμΌμ μμ±ν©λλ€. μλν©λλ€. κ·Έλ¬λ λ¬Έμμ λ°λ₯΄λ©΄ Pythonμμ κ°μ Έμ¬ μ μλλ‘ νμ₯ λͺ¨λμ λΉλνλ λ€μ λ¨κ³λ λ€μκ³Ό κ°μ΅λλ€.
$ f2py -c fib1module.c
κ·Έλ¬λ λ€μ λ©μμ§μ ν¨κ» μ€ν¨ν©λλ€.
$ f2py -c fib1module.c --verbose
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building extension "untitled" sources
build_src: building npy-pkg config files
running build_ext
new_compiler returns <class 'distutils.unixccompiler.UnixCCompiler'>
customize UnixCCompiler
customize UnixCCompiler using build_ext
********************************************************************************
<class 'distutils.unixccompiler.UnixCCompiler'>
preprocessor = ['gcc', '-pthread', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-Wl,--sysroot=/', '-E']
compiler = ['gcc', '-pthread', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-Wl,--sysroot=/', '-Wsign-compare', '-DNDEBUG', '-g', '-fwrapv', '-O3', '-Wall', '-Wstrict-prototypes', '-std=c99']
compiler_so = ['gcc', '-pthread', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-Wl,--sysroot=/', '-Wsign-compare', '-DNDEBUG', '-g', '-fwrapv', '-O3', '-Wall', '-Wstrict-prototypes', '-fPIC', '-std=c99']
compiler_cxx = ['g++', '-pthread', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-Wl,--sysroot=/']
linker_so = ['gcc', '-pthread', '-shared', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-L/opt/miniconda/envs/numpy-dev/lib', '-Wl,-rpath=/opt/miniconda/envs/numpy-dev/lib', '-Wl,--no-as-needed', '-Wl,--sysroot=/']
linker_exe = ['gcc', '-pthread', '-B', '/opt/miniconda/envs/numpy-dev/compiler_compat', '-Wl,--sysroot=/']
archiver = ['ar', 'rc']
ranlib = None
libraries = []
library_dirs = []
include_dirs = ['/opt/miniconda/envs/numpy-dev/include/python3.6m']
********************************************************************************
building 'untitled' extension
compiling C sources
C compiler: gcc -pthread -B /opt/miniconda/envs/numpy-dev/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -std=c99
compile options: '-I/home/melissa/projects/numpy/numpy/core/include -I/opt/miniconda/envs/numpy-dev/include/python3.6m -c'
gcc: fib1module.c
fib1module.c:16:10: fatal error: fortranobject.h: Arquivo ou diretΓ³rio inexistente
16 | #include "fortranobject.h"
| ^~~~~~~~~~~~~~~~~
compilation terminated.
error: Command "gcc -pthread -B /opt/miniconda/envs/numpy-dev/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -std=c99 -I/home/melissa/projects/numpy/numpy/core/include -I/opt/miniconda/envs/numpy-dev/include/python3.6m -c fib1module.c -o /tmp/tmpyjgu4iq5/fib1module.o -MMD -MF /tmp/tmpyjgu4iq5/fib1module.o.d" failed with exit status 1
νκΈ°
$ f2py -c fib1module.c -I/home/melissa/projects/numpy/numpy/f2py/src -m fib1module
μλνλ κ² κ°μ§λ§ (μ΄κ²μ λ΄ fortranobject.h
νμΌμ μμΉμ
λλ€) λͺ¨λμ κ°μ Έμ¬ μ μμ΅λλ€.
>>> import fib1module
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/melissa/projects/numpy/doc/source/f2py/fib1module.cpython-36m-x86_64-linux-gnu.so: undefined symbol: PyFortran_Type
TL; DR : μ΄κ²μ λ²κ·Έμ
λκΉ, μλλ©΄ μ°λ¦¬κ°ν΄μλ μλλ μΌμ
λκΉ ( .c
μμ€λ₯Ό μμ± ν λ€μ λ³λμ λ¨κ³μμ νμ₯ λͺ¨λμ λΉλ)?
>>> import sys, numpy; print(numpy.__version__, sys.version)
1.18.0.dev0+8d217b0 3.6.7 | packaged by conda-forge | (default, Jul 2 2019, 02:18:42)
[GCC 7.3.0]
@melissawm λ³΄κ³ μμ κ°μ¬λ립λλ€. μ°λ¦¬λμ΄ νμ΄μ§μ λν΄ λ§νκ³ μμ΅λλ€ : https://numpy.org/devdocs/f2py/getting-started.html?
λ³΄κ³ μλ λ΄μ©μ νμΈν μ μμ΅λλ€.
$ f2py -m fib1 fib1.f
$ f2py -c fib1module.c
...
fib1module.c:16:10: fatal error: 'fortranobject.h' file not found
#include "fortranobject.h"
κ·Έλ¬λ λ¬Έμ νμ΄μ§λ λμ $ f2py -c -m fib1 fib1.f
μ μννλ©° (μ½λλ₯Ό μμ±νκ³ ν λ²μ μ»΄νμΌ) μμλλ‘ μλν©λλ€. -m
λ° -c
μ΄ μ§μλμλμ§ νμ€νμ§ μμ΅λλ€. μ¬λ°λ₯Έ ν¬ν¨ κ²½λ‘λ₯Ό μλμΌλ‘ μΆκ°νμ¬ -c
-λ§ μλνλλ‘ λ§λ€ μ μμ΅λλ€.-μλ§λ μ΄λ ΅μ§λ μμ§λ§ νμνμ§ νμ€νμ§ μμ΅λλ€.
@pearu μ΄λ€ μκ°?
μ΄λ€ λ¬Έμκ° μ΄κ²μ λ§νλμ§ μ λͺ¨λ₯΄κ² μ§λ§ λ€μμ μλͺ»λμμ΅λλ€.
$ f2py -c fib1module.c
f2py -c ...
λ κΈ°μ‘΄ .pyf
νμΌ (μμ€ / μ€λΈμ νΈ / λΌμ΄λΈλ¬λ¦¬ νμΌ ν¬ν¨)μ μ μ©νκ±°λ -m <modulename>
μ΅μ
(μμ€ / μ€λΈμ νΈ / λΌμ΄λΈλ¬λ¦¬ νμΌ ν¬ν¨)μ μ§μ ν΄μΌν©λλ€. . f2py -c
λ μμ± λ C / API νμ₯ λͺ¨λμ μ§μ μ»΄νμΌνκΈ°μν κ²μ΄ μλλλ€ (μ μ ν ν¬ν¨ λλ ν 리 νλκ·Έ λ° μμ€ / κ°μ²΄ νμΌ μ
λ ₯μΌλ‘μ΄λ₯Ό μν ν μ μμ).
λ€μ μ΅μ μ€ νλλ₯Ό μ¬μ©νμμμ€.
f2py -c -m fib1 fib1.f
λλ
f2py -m fib1 fib1.f -h fib1.pyf
f2py -c fib1.pyf fib1.f
μ΄λ¬ν μλ μμ f2py λͺ λ Ή μ€μμ 건λ λ°λ κ²μ΄ μμΌλ©΄ μ€ν¨κ° μμλλ€λ μ μμ μ΅μνμ κ²μ λλ€.
μ€μ λ‘μ΄ νμ΄μ§μ λν΄ μ΄μΌκΈ°νκ³ μμ΅λλ€ : https://numpy.org/devdocs/f2py/usage.html
νλͺ© 2μ 3μλ λ€μμ΄ μμ΅λλ€. νλͺ© 2λ -m
λλ -c
μ΅μ
μμ΄ f2py
λ₯Ό μ€ννλ κ²μ
λλ€. νλͺ© 3μ λ§νλ€
νμ₯ λͺ¨λμ λΉλνλ €λ©΄
f2py -c <options> <fortran files> \
[[ only: <fortran functions> : ] \
[ skip: <fortran functions> : ]]... \
[ <fortran/c source files> ] [ <.o, .a, .so files> ]
<fortran files>
μ μλͺ νμΌμ΄ ν¬ν¨λμ΄ μμΌλ©΄ νμ₯ λͺ¨λμ μμ€κ° μμ±λ©λλ€.
λͺ¨λ Fortran λ° C μμ€κ° μ»΄νμΌλκ³ λ§μ§λ§μΌλ‘ λͺ¨λ κ°μ²΄ λ° λΌμ΄λΈλ¬λ¦¬ νμΌμ΄
νμ¬ λλ ν 리μ μ μ₯λλ νμ₯ λͺ¨λ<modulename>.so
.
<fortran files>
μ μλͺ νμΌμ΄ ν¬ν¨λμ΄ μμ§ μμΌλ©΄ νμ₯ λͺ¨λμ λ€μκ³Ό κ°μ΄ ꡬμ±λ©λλ€.
μΌμμ μΈ μλͺ μ μν΄ λͺ¨λ Fortran μμ€ μ½λλ₯Ό μ€μΊν©λλ€.
λΉμ μ΄ λ§νλλ‘, μ°λ¦¬κ° .c
μμ€λ₯Ό μ§μ μ¬μ©ν΄μλ μλλ€λ κ²μ μ΄ν΄ν©λλ€. .c
νμΌμ μμ±νλ©΄ λμ€μ μ¬μ©ν μ μμ΅λκΉ?
μ λ ₯ ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
μ€μ λ‘μ΄ νμ΄μ§μ λν΄ μ΄μΌκΈ°νκ³ μμ΅λλ€ : https://numpy.org/devdocs/f2py/usage.html
μ΄ νμ΄μ§μμλ f2py
λͺ
λ Ή μ€ μ΅μ
κ³Ό λ€μν λͺ¨λλ₯Ό μ€λͺ
ν©λλ€. Python νμ₯ λͺ¨λμ λΉλνλ λ°©λ²μ μ΄ν΄νκ³ μλ€κ³ κ°μ ν©λλ€ (μ : https://docs.python.org/3.8/extending/index.html μ°Έμ‘°).
f2pyλ C ν¨μ ( .c
νμΌμ ν¬ν¨)λ₯Ό λννλ νμ₯ λͺ¨λμ λ§λλ λ° μ¬μ©ν μ μμΌλ―λ‘ "μ°λ¦¬λ .c μμ€λ₯Ό μ§μ μ¬μ©ν΄μλ μλ©λλ€"λΌλ λ¬Έμ₯μ μ ννμ§ μμ΅λλ€.
νλλ ꡬλ³ν΄μΌνλ€ .c
f2pyκ° λ°μνκ³ μλ€λ νμΌμ .c
C ν¨μμ μ¬μ©μ ꡬνμ ν¬ν¨νλ νμΌ. f2pyκ° μμ±νλ .c
νμΌμ νμ₯ λͺ¨λμ΄ λΉλλλ λ°©λ² λλ f2pyλ₯Ό λλ²κΉ
νλ λ°©λ²μ μμ ν μ μ΄ν΄μΌνλ κ²½μ°μλ§ μ μ©ν©λλ€. λ€λ₯Έ λͺ¨λ κ²½μ°μλ λΉλ νλ‘μΈμ€μμ μλμΌλ‘ μμ±λλ―λ‘ νμ₯ λͺ¨λμ μμ± ν νμκ° μμ΅λλ€.
λ€λ₯Έ μμ΄λμ΄κ° μμΌλ©΄ μλ €μ£ΌμΈμ. μμ @pearu μ μ€λͺ μ λ¬Έμμ μΆκ°νκ³ μμ΅λλ€. κ·νμ μ견μ κ°μ¬λ립λλ€!
λ¬Έμ λ₯Ό μ’ κ²°ν΄λλ©λλ€ (λλ PRμ΄ μΉμΈ λ νμ λ§ν΄μΌν©λκΉ?).
μ΄ λ¬Έμ λ₯Ό λ€λ£¨λ PRμ΄ μλ½λλ©΄ μ’ λ£νλ κ²μ΄ μ’μ΅λλ€.
μ΄ λ¬Έμ λ₯Ό λ€λ£¨λ PRμ΄ μλ½λλ©΄ μ’ λ£νλ κ²μ΄ μ’μ΅λλ€.
+1
@melissawm μ»€λ° λ©μμ§ μ€ νλμ closes gh-14960
λ₯Ό μΆκ° ν μλ μμ΅λλ€. κ·Έλ¬λ©΄ PRμ΄ λ³ν©λλ©΄ λ¬Έμ κ° μλμΌλ‘ λ«νλλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄λ€ λ¬Έμκ° μ΄κ²μ λ§νλμ§ μ λͺ¨λ₯΄κ² μ§λ§ λ€μμ μλͺ»λμμ΅λλ€.
f2py -c ...
λ κΈ°μ‘΄.pyf
νμΌ (μμ€ / μ€λΈμ νΈ / λΌμ΄λΈλ¬λ¦¬ νμΌ ν¬ν¨)μ μ μ©νκ±°λ-m <modulename>
μ΅μ (μμ€ / μ€λΈμ νΈ / λΌμ΄λΈλ¬λ¦¬ νμΌ ν¬ν¨)μ μ§μ ν΄μΌν©λλ€. .f2py -c
λ μμ± λ C / API νμ₯ λͺ¨λμ μ§μ μ»΄νμΌνκΈ°μν κ²μ΄ μλλλ€ (μ μ ν ν¬ν¨ λλ ν 리 νλκ·Έ λ° μμ€ / κ°μ²΄ νμΌ μ λ ₯μΌλ‘μ΄λ₯Ό μν ν μ μμ).λ€μ μ΅μ μ€ νλλ₯Ό μ¬μ©νμμμ€.
λλ
μ΄λ¬ν μλ μμ f2py λͺ λ Ή μ€μμ 건λ λ°λ κ²μ΄ μμΌλ©΄ μ€ν¨κ° μμλλ€λ μ μμ μ΅μνμ κ²μ λλ€.