如何在虚拟环境中使用pywin32而不包含主环境的site-packages文件夹?

54 投票
5 回答
19494 浏览
提问于 2025-04-15 16:35

我正在使用PyInstaller,它是在Python 2.6下工作的。不过,由于微软搞的一些乱七八糟的东西,导致它只部分支持,因为现在Python是用MSVC8编译的。

问题在于,嵌入清单的支持需要依赖pywin32这个扩展来构建。这很麻烦,因为在我创建virtualenv的时候,如果不把主机的site-packages文件夹包含进去(这有点违背了构建环境的初衷),我就找不到方法来安装所需的扩展,这样PyInstaller就无法访问它们。

有没有人找到解决这个问题的方法?

5 个回答

13

如果你使用的是 Python 2.7 或 3.x 版本,可以使用 pypiwin32 这个工具。

你只需要在命令行输入 pip install pypiwin32 就可以安装它了。

76

我找到了一些信息,虽然链接现在已经失效,但内容还是有用的:

  1. 先去这个网站 http://sourceforge.net/projects/pywin32/files/ 找到你需要的exe文件的链接。
  2. 激活你的虚拟环境(virtualenv)。
  3. 运行 easy_install http://PATH.TO/EXE/DOWNLOAD 来安装。

这个方法在现代版本的setuptools中是有效的(大约2014年2月,tovmeod在评论中提到的)。


如果你使用的是旧版本的setuptools(或者是合并回setuptools的distribute),你可能会看到这样的错误信息:

错误:c:\users\blah\appdata\local\temp\easy_install-ibkzv7\pywin32-214.win32-py2.6.exe 不是一个有效的distutils Windows .exe文件。

在这种情况下,你可以尝试:

  1. 自己下载exe文件。
  2. 激活你的虚拟环境。
  3. 运行 easy_install DOWNLOADED_FILE.exe 来安装。

我曾经试过用“pip install”而不是“easy_install”,但这个方法没有成功,可能以后也不会成功(需要引用来源)。


最后,我找到了一种解决方案,但还没测试过,链接在这里 http://www.mail-archive.com/python-list@python.org/msg272040.html,内容是:

通过把pywin32.pth文件复制到我的虚拟环境的site-packages目录,并编辑这个文件指向正确的路径,解决了问题。

如果其他方法都不行,也许这个方法可以试试?

4

好的,既然我需要找到解决办法,我就自己动手做了一个临时的方案。我在内部创建了一个git仓库,里面有一个经过修改的pywin32版本,可以在虚拟环境中用标准的setup.py脚本安装。为了让它正常工作,我花了很多时间调整,最后终于让它加载成功,现在依赖的代码也能按我需要的方式运行了。如果大家觉得这对社区有帮助,请留言告诉我:如果评论够多,我会尝试在我的github账号上发布一些东西。

撰写回答