用cx_freeze打包scrapy

坑爹Windows环境配置,以及setup脚本的编写

安装cx_freeze

先说说环境

开始安装

  • 先安装最新版 cx_Freeze
python -m pip install cx_Freeze --upgrade
  • 确认安装
    在命令行输入 cxfreeze -h

此时没有出现以下回应
screenshot

是因为还有没有生成.bat文件

切换到 C:\Python35\Scripts,发现目录下有个cxfreeze-postinstall,这是一个python执行文件,打开cmd,

输入 python cxfreeze-postinstall

之后再输入一次cxfreeze -h

这次出现上图的提示,说明安装成功

编写 setup脚本

文档

import os
import platform
import sys
from cx_Freeze import setup, Executable

# 设置环境变量

如果你遇到你写的模块找不到路径,添加上去
我的app叫 foo
sys.path.append(os.path.join(os.path.abspath(os.path.curdir), 'foo'))
os.environ['TCL_LIBRARY'] = r'C:\Python35\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Python35\tcl\tk8.6'
packages = ["os", "scrapy", "PIL", "platform", "re", "six", "tool", "lxml", 'amazon_orders.tool']
includes = ['amazon_orders.tool']

build_exe_options = {"packages": packages,
                     "includes": includes,
                     "excludes": []}

base = None
if platform.system() == 'Windows':
    base = 'Win32GUI'

exe = Executable(
    # what to build
    script="run.py",  # the name of your build_frame python script goes here
    initScript=None,
    base=base,  # if creating a GUI instead of a console app, type "Win32GUI"
    targetName="amazon_crawl.exe",  # this is the name of the executable file
)

setup(
    # the actual setup & the definition of other misc. info
    name="Amazon",
    version="0.99",
    description="Kiss my ass",
    options={"build_exe": build_exe_options},
    author="Asshole",
    executables=[exe]
)

同目录下的run.py

import os

cmd = 'scrapy crawl orders'
os.system(cmd)

解决报错

no module named Zope.interface error when using cx_Freeze

在C:\Python35\Lib\site-packages\zope 下新建一个 __init__.py即可,原因是目录下没有 __init__.py解析器不会认为这是一个包。


KeyError: ‘TCL_Library’ 或者 KeyError: ‘TK_LIBRARY’

在setup.py 中 加入

os.environ[‘TCL_LIBRARY’] = r’C:\Python35\tcl\tcl8.6’
os.environ[‘TK_LIBRARY’] = r’C:\Python35\tcl\tk8.6’

更多细节,请看 https://stackoverflow.com/questions/35533803/keyerror-tcl-library-when-i-use-cx-freeze


最后

最后我也不知道说什么好,被折磨得心好累。。。

如果遇到其他报错,欢迎提出。