代码之家  ›  专栏  ›  技术社区  ›  Han Zhengzu

在Python3环境中使用f2py时出现错误“需要类似字节的对象,而不是'str'”

  •  0
  • Han Zhengzu  · 技术社区  · 7 年前

    我发现python 3环境中的f2py可能安装不正确。因此,我尝试使用以下文件测试f2py:

    $vi forMatMul_ref.f90  
         subroutine matrixMult (C , A , B , n )
         implicit none
         integer , intent (in) :: n
         real *8 , intent (in) :: A (n , n )
         real *8 , intent (in) :: B (n , n )
         real *8 , intent ( out ) :: C (n , n )
         C = matmul (A , B )         
         return
         end subroutine matrixMultul_ref.f90
    

    然后我在IPYTHON中测试文件:

    import numpy as np
    import numpy . f2py as f2py
    
    fid = open ("forMatMul_ref.f90")    
    source = fid.read()
    fid.close()
    
    f2py.compile(source, modulename = "forMatMul")
    import forMatMul
    AB =  forMatMul . matrixmult (A , B )
    

    但是,当运行f2py的编译过程时出现错误,如下所示:

    类型错误回溯(最近一次调用) 在() ---->1 f2py.compile(源,modulename='forMatMul')

    /Users/HYF/anaconda/envs/py35/lib/python3.5/site-packages/numpy/f2py/__init__.py in compile(source, modulename, extra_args, verbose, source_fn, extension)
         57 
         58     try:
    ---> 59         f.write(source)
         60         f.flush()
         61 
    
    /Users/HYF/anaconda/envs/py35/lib/python3.5/tempfile.py in func_wrapper(*args, **kwargs)
        481             @_functools.wraps(func)
        482             def func_wrapper(*args, **kwargs):
    --> 483                 return func(*args, **kwargs)
        484             # Avoid closing the file as long as the wrapper is alive,
        485             # see issue #18879.
    
    TypeError: a bytes-like object is required, not 'str'
    

    以下是一些基本信息:

    ## Computer OS
    Darwin I.local 14.3.0 Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64 x86_64 i386 MacBookAir7,2 Darwin
    ## Python environment
    /Users/HYF/anaconda/envs/py35/bin/python
    ## Fortran compiler (GCC 4.9.4 contains both C and Fortran compiler)
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.2/lto-wrapper
    Target: x86_64-apple-darwin14.0.0
    Configured with: ../gcc-4.9-20141029/configure --enable-languages=c++,fortran
    Thread model: posix
    gcc version 4.9.2 20141029 (prerelease) (GCC) 
    (py35) 
    

    我想听听如何进行的建议。

    聚苯乙烯

    我已经通过在numpy/numpy/f2py/中编辑初始化py解决了这个问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ed Bordin    7 年前

    尝试以二进制模式打开文件- open("forMatMul_ref.f90", "rb") -它将为源代码提供原始字节(这似乎是它所期望的),而不是解码为字符串。这可能是它们将遗留的python 2代码移植到python 3中运行的副作用,否则字符串对象似乎是源代码的适当表示。如果您感兴趣,本文将描述Python 2和3之间的字符串所做的更改: https://timothybramlett.com/Strings_Bytes_and_Unicode_in_Python_2_and_3.html