带有 import pyfits 的 py2exe 导致错误
py2exe with import pyfits cause error
使用 import pyfits 在 py 文件中执行 py2exe 时,导致错误。
如何避免这个错误?
我准备了test.py和test_setup.py(for py2exe),如下图
test.py 是显示参数指定的 fitsfile 数据的简单程序。
- OS : Windows7 64 位
- python : 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
)
dump.__doc__ += _tdump_file_format.replace('\n', '\n ')
似乎 pyfits 正在做一些 class 级别的文档字符串操作。这可以合理地被认为是一个错误,因为不能总是假设方法的 __doc__
将是一个字符串,就像在使用优化编译(就像你一样)的情况下,除其他外,剥离输出所有文档字符串。
我认为最简单的解决方法是禁用优化,至少现在是这样,或者修补 pyfits 以删除该行和任何类似的行。
使用 import pyfits 在 py 文件中执行 py2exe 时,导致错误。
如何避免这个错误?
我准备了test.py和test_setup.py(for py2exe),如下图
test.py 是显示参数指定的 fitsfile 数据的简单程序。
- OS : Windows7 64 位
- python : 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
)
dump.__doc__ += _tdump_file_format.replace('\n', '\n ')
似乎 pyfits 正在做一些 class 级别的文档字符串操作。这可以合理地被认为是一个错误,因为不能总是假设方法的 __doc__
将是一个字符串,就像在使用优化编译(就像你一样)的情况下,除其他外,剥离输出所有文档字符串。
我认为最简单的解决方法是禁用优化,至少现在是这样,或者修补 pyfits 以删除该行和任何类似的行。