使用cx_Freeze或py2exe发出包装scrapy spider

时间:2014-04-28 21:34:00

标签: python wxpython scrapy py2exe cx-freeze

我已经使用Scrapy和wxPython创建了一个刮板,它按预期工作,将带有结果的文件以CSV格式导出到桌面。我正尝试使用以下命令提示行将此包装到cx_Freeze的可执行文件中:

cxfreeze ItemStatusChecker.py --target-dir dist

这似乎工作正常,使用ItemStatusChecker.exe构建dist目录

但是,当我打开ItemStatusChecker.exe时,我在命令提示符下出现以下错误,我的GUI无法启动:

Traceback (most recent call last):
    File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
      exec code in m.__dict__
    File "ItemStatusChecker.py", line 6, in <module>
    File "C:\Python27\lib\site-packages\scrapy\__init__.py", line 6, in <module>
      __version__ = pkgutil.get_data(__package__, 'VERSION').strip()
    File "C:\Python27\lib\pkgutil.py", line 591, in get_data
      return loader.get_data(resource_name_)
IOError: [Errno 2] No such file or directory: 'scrapy\\VERSION'

我也试过通过py2exe运行它。这似乎工作正常,创建dist目录,但我在尝试启动exe时遇到一个非常类似的错误:

Traceback (most recent call last):
  File "ItemStatusChecker.py", line 6, in <module>
  File "scrapy\__init__.pyc", line 6, in <module>
  File "pkgutil.pyc", line 591, in get_data
IOError: [Errno 2] No such file or directory: 'scrapy\\VERSION'

我是一个蟒蛇新手,所以如果我遗漏任何必要的细节,请告诉我。如果您有任何建议,请提前感谢您!

2 个答案:

答案 0 :(得分:0)

听起来像cxfreeze和py2exe没有自动获取scrapy包。对于cx_freeze,您可能需要查看 - include-modules 指令:

对于py2exe,您需要创建一个 setup.py 脚本,其中指定了 includes 列表。这是一个教程,展示了如何做到这一点:

答案 1 :(得分:0)

看看(http://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files

我的解决方案使用cx-freeze:

修改文件 C:\ Python2.7 \ Lib \ site-packages \ scrapy__init __。py

import sys
# Scrapy version
import pkgutil
if getattr(sys, 'frozen', False):
    __version__ = 'VERSION'.decode('ascii').strip()
else:
    __version__ = pkgutil.get_data(__package__, 'VERSION').decode('ascii').strip()

和文件 C:\ Python2.7 \ Lib \ site-packages \ scrapy \ responsetypes.py

import sys
from mimetypes import MimeTypes
from pkgutil import get_data
...
   def __init__(self):
        self.classes = {}
        self.mimetypes = MimeTypes()
        if getattr(sys, 'frozen', False):
            mimedata = 'mime.types'
        else:
            mimedata = get_data('scrapy', 'mime.types')
        self.mimetypes.readfp(StringIO(mimedata))

在setup.py中包含此构建exe选项

"include_files": [("C:\\Python27\\Lib\\site-packages\\scrapy\\VERSION","VERSION"),
    ("C:\\Python27\\Lib\\site-packages\\scrapy\\mime.types","mime.types")]}