无法导入xlrd模块
我有几个包是我的可执行脚本在用的,它们依赖于一个叫做xlrd的模块。所以我尝试在设置脚本中通过使用include选项来包含这个模块,如下所示。但是,当runner.py调用这些包的时候,虽然library.zip文件里有xlrd的文件,但模块却无法导入xlrd。
from cx_Freeze import setup, Executable
import xlrd
buildOptions = dict(
compressed = True,
optimize=2,
path=sys.path+[".\\uitls", “.\\supported”],
include_files=[“Doc"],
includes=[“xlrd”, "win32com"],
packages=["utils", ”supported"],
append_script_to_exe=True,
copy_dependent_files=True,
)
setup(
name = "TestExecutable",
version = "0.1",
options = dict(build_exe = buildOptions),
executables = [Executable(
script=r".\\codebase\\ runner.py",
icon=".\\icon.ico",
base="Win32GUI")]
)
而如果我在runner.py中直接导入xlrd,它就能成功导入。我不太明白这是怎么回事,因为那些依赖的包无法导入xlrd。我是不是漏掉了什么选项,或者做错了什么?
更新:我发现依赖的包是通过创建一个新进程来调用的,这样就会生成一个新的环境,而这个环境里没有加载xlrd模块,也不知道包含它的library.zip文件。所以,现在我想知道,是否有办法让我在新进程中也能让xlrd模块从zip文件中可用?
谢谢!
4 个回答
我找到了解决这个问题的方法。我把lib\site-packages文件夹里的xlrd文件夹复制了一份,然后把它放在include_files选项里。现在,当我的子进程可执行文件运行时,路径已经设置好了,所以它知道xlrd的位置,这样可执行文件就能成功导入xlrd了。
也许在 path=sys.path+[".\\uitls", “.\\supported”],
中的 uitls
应该是 utils
。
你知道 xlrd
是安装在哪里的吗?
xlrd
是一个包,不是模块;你有没有试过把它放在包的列表里,而不是包含的列表里?
要一致地使用原始字符串。
为什么在 script=r".\\codebase\\ runner.py",
中有两个反斜杠?在Windows系统中,多个反斜杠会被当作一个看待,但为什么要冒这个险呢?你在 runner.py
前面为什么有个空格?你确定这个设置文件真的能运行吗?
当你下载xlrd这个包的时候,有两个选择:
- 把
xlrd-0.7.1\xlrd\
加入到你的Python路径中。 - 通过命令安装它,输入
python xlrd-0.7.1\setup.py install
。
完成后(无论你选择哪个方法),确认一下你能否导入这个包。打开Python,输入 import xlrd
。如果没有出现错误,那就说明安装成功了。