无法导入xlrd模块

3 投票
4 回答
25945 浏览
提问于 2025-04-16 12:59

我有几个包是我的可执行脚本在用的,它们依赖于一个叫做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 个回答

2

我找到了解决这个问题的方法。我把lib\site-packages文件夹里的xlrd文件夹复制了一份,然后把它放在include_files选项里。现在,当我的子进程可执行文件运行时,路径已经设置好了,所以它知道xlrd的位置,这样可执行文件就能成功导入xlrd了。

2

也许在 path=sys.path+[".\\uitls", “.\\supported”], 中的 uitls 应该是 utils

你知道 xlrd 是安装在哪里的吗?

xlrd 是一个包,不是模块;你有没有试过把它放在包的列表里,而不是包含的列表里?

要一致地使用原始字符串。

为什么在 script=r".\\codebase\\ runner.py", 中有两个反斜杠?在Windows系统中,多个反斜杠会被当作一个看待,但为什么要冒这个险呢?你在 runner.py 前面为什么有个空格?你确定这个设置文件真的能运行吗?

3

当你下载xlrd这个包的时候,有两个选择:

  1. xlrd-0.7.1\xlrd\ 加入到你的Python路径中。
  2. 通过命令安装它,输入 python xlrd-0.7.1\setup.py install

完成后(无论你选择哪个方法),确认一下你能否导入这个包。打开Python,输入 import xlrd。如果没有出现错误,那就说明安装成功了。

撰写回答