py2exe с импортом pyfits вызывает ошибку

Когда сделать py2exe в py-файле с импортом pyfits, это вызвало ошибку.

Как избежать этой ошибки?

Я готовлю test.py и test_setup.py(для py2exe), которые показаны ниже.

test.py - простая программа для отображения данных файла соответствия, заданного аргументом.

  • ОС: Windows7 64bit
  • питон: 2,7
  • pyfits: 3.3
  • numpy: 1.9.2

на cmd.exe:

\python test_setup.py py2exe

=> успех

\python test.py test.fits
[[[574 574 579 ..., 579 585 581]
  [574 582 583 ..., 582 579 577]
  [581 583 578 ..., 572 580 580]
  ...,
  [584 585 580 ..., 584 582 579]
  [585 583 582 ..., 586 575 578]
  [584 580 583 ..., 585 585 589]]]

=> успех

\dist\test.exe test.fits
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    import pyfits
  File "pyfits\__init__.pyo", line 11, in <module>
  File "pyfits\core.pyo", line 42, in <module>
  File "pyfits\convenience.pyo", line 62, in <module>
  File "pyfits\hdu\__init__.pyo", line 2, in <module>
  File "pyfits\hdu\compressed.pyo", line 21, in <module>
  File "pyfits\hdu\table.pyo", line 646, in <module>
  File "pyfits\hdu\table.pyo", line 909, in BinTableHDU
TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str'

=> ошибка


test.py

# -*- coding: utf-8 -*-

import sys
import pyfits

def showfits(path):
    hdulist = pyfits.open(path)
    imgs = hdulist[0].data
    hdulist.close()
    print imgs

if __name__ == "__main__":
    showfits(sys.argv[1])

test_setup.py

# -*- coding: utf-8 -*- 

from distutils.core import setup
import py2exe

option = {
    "compressed"    :    1    ,
    "optimize"      :    2    ,
    "bundle_files"  :    3    
}

setup(
    options = {
        "py2exe"    :    option
    },

    console = [
        {
            "script"   :    "test.py"
        }
    ],
    zipfile = None
)

1 ответ

Решение

Глядя на строку, на которой он падает:

dump.__doc__ += _tdump_file_format.replace('\n', '\n        ')

кажется, что Pyfits делает некоторые манипуляции с документами на уровне класса. Это может быть разумно рассмотрено как ошибка, так как не всегда можно предположить, что метод __doc__ будет строкой, как в случае использования оптимизированной компиляции (как вы), которая, помимо прочего, удаляет все строки документации.

Я думаю, что самыми простыми обходными путями было бы либо отключить оптимизацию, по крайней мере, на данный момент, либо установить патчи для удаления этой строки и любой подобной ей.

Другие вопросы по тегам