将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题

Posted

技术标签:

【中文标题】将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题【英文标题】:Issues converting a python script to a linux binary that uses lxml's etree module 【发布时间】:2014-01-02 21:36:00 【问题描述】:

我在 2013 年 9 月遇到的问题基本上与此人相同。

相关问题: Cx_freeze with lxml.html TypeError(有人通过编辑cx-freeze代码找到了修复,但没有深入解释),cx-freeze doesn't find all dependencies(不知道如何在Linux中打开鸡蛋)

在我拥有 50 名声望之前,我不能对此发表评论,所以我发布了这个帖子。我正在使用 4.3.1 的 cx_freeze 来冻结以下模块:

import sys
import getopt
from time import gmtime, strftime, time
from os.path import exists
from lxml import etree

我的 setup.py 脚本:

import sys
from cx_Freeze import setup, Executable

#build_exe_options = "packages": ["sys","getopt","time","os","lxml"]

build_exe_options = "packages": ["sys","getopt","time","os","lxml","BeautifulSoup","lxml.html.soupparser","lxml.html.html5parser","lxml.html.diff","lxml.ElementInclude"]

setup(
    name = "cmpxml",
    version = "r13",
    description = "",
    options = "build_exe": build_exe_options,
    executables = [ Executable("cmpxml.py", base = None) ] )

我跑

python setup.py build_exe

python setup.py 构建

并收到以下消息:

? cjkcodecs.aliases imported from BeautifulSoup
? html.entities imported from lxml.html.soupparser
? html5lib imported from lxml.html.html5parser
? iconv_codec imported from BeautifulSoup
? lxml.html.escape imported from lxml.html.diff
? urllib.parse imported from lxml.ElementInclude
? urllib.request imported from lxml.ElementInclude

运行我编译的程序时,尝试导入 lxml 失败,所以我觉得上述消息对于调试编译至关重要。

是我做错了什么还是 cx-freeze 有问题?我的 LXML 模块是使用 pip 安装的(因此不需要 PYTHONPATH),我在 Ubuntu 13.10 上使用 python 2.7。


Nuitka 0.4.7:

其他但相关的问题:巧合的是,我也遇到了与 Nuitka 类似的问题。

/usr/share/nuitka/bin/nuitka cmpxml.py --exe --recurse-all --execute

会正确编译,但是在运行 ./cmpxml 时会找不到 lxml 模块。


PyInstaller 2.1:

还尝试将 pyinstaller 与包含 hook-lxml.etree.py、hook-lxml.objectify.py、hook-xml.etree.cElementTree.py 的 hooks 目录一起使用并运行

pyinstaller --additional-hooks-dir=hooks/ cmpxml.py

在 dist/cmpxml/cmpxml 中运行二进制文件时仍然无法检测到 lxml。构建目录中的警告文件包含这些缺失的模块,并且从 pyinstaller git 下载所有挂钩并没有解决问题。

$ cat build/cmpxml_noetree/warncmpxml_noetree.txt
W: no module named msvcrt (conditional import by subprocess)
W: no module named msvcrt (delayed import by getpass)
W: no module named _dummy_threading (top-level import by dummy_threading)
W: no module named cl (delayed, conditional import by aifc)
W: no module named rourl2path (conditional import by urllib)
W: no module named nt (conditional import by __main__)
W: no module named nt (conditional import by pyi_os_path)
W: no module named _subprocess (conditional import by subprocess)
W: no module named cl (delayed import by aifc)
W: no module named _scproxy (conditional import by urllib)
W: no module named org (top-level import by pickle)
W: no module named EasyDialogs (conditional import by getpass)
W: no module named SOCKS (top-level import by ftplib)
W: no module named _winreg (delayed import by urllib)
W: no module named nt (top-level import by ntpath)
W: no module named msvcrt (conditional import by getpass)
W: no module named _winreg (top-level import by mimetypes)
W: no module named org (top-level import by copy)
W: no module named _emx_link (conditional import by os)

奇怪的是,这个警告文件中甚至没有提到 lxml。出于某种原因,它只是不包括在内。


任何帮助将不胜感激。 Nuitka、pyinstaller、freeze、cx-freeze,似乎都是很棒的程序,但似乎对我不起作用。

【问题讨论】:

您从 cx_Freeze 显示的“错误”是警告,而不是错误 - 当您尝试运行它生成的程序时,您是否收到错误? 我意识到它们是警告,但由于当我尝试运行它生成的程序时它不起作用,我试图显示尽可能多的输出以调试情况。 你能把运行程序的错误也显示出来吗? 我认为这个问题是由于缺少导入检查模块造成的。 你有更多的细节吗?在 cx_Freeze 中可能会修复它,但很难知道问题出在哪里。 【参考方案1】:

我的一个朋友告诉我问题是由于缺少检查模块的导入。

cx-freeze编译上面的正确命令:

cxfreeze cmpxml.py --target-dir cmpxml --include-modules=sys,getopt,time,os,inspect,lxml.etree,lxml._elementpath,gzip,encodings.utf_8,encodings.ascii

【讨论】:

【参考方案2】:

对于那些在谷歌上搜索过这个问题的人。 OP 使用 Nuitka 4.3.1,但在 Nuitka 0.5.1 中,问题似乎已解决http://nuitka.net/posts/nuitka-release-051.html

【讨论】:

我用的是cxFreeze的4.3.1。一定是笔误。我使用的是 0.4.7 版。我会用新版本试试看是否有效。

以上是关于将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 XPath 和 LXML

使用lxml的Python脚本,xpath返回空列表

lxml - 从间接url转换为direct url

谷歌表格脚本将值转换为小写

用于 80+GB XML 的 Python sax 到 lxml

CentOS 6.3 上的 Python lxml etree