在网络驱动器上安装带有Python Win32扩展的Python
我需要让很多台运行Windows XP的电脑都使用相同版本的Python,并且安装一些模块,其中一个是python-win32。我想到了一个办法,就是把Python安装在一个网络驱动器上,这样所有的客户端机器都能访问,然后只需要在客户端调整一下路径。Python从网络上启动是没问题的,但当我尝试导入win32com时,弹出了一个错误提示:
找不到动态链接库pywintypes24.dll中的过程入口点 ?PyWinObject_AsHANDLE@@YAHPAU_object@@PAPAXH@Z。
我关闭这个提示后,控制台显示:
导入错误:DLL加载失败:找不到指定的过程。
我在Python的目录里找到了pywintypes24.dll,它在“Lib\site-packages\pywin32_system32”文件夹里。
我漏掉了什么呢?有没有其他方法可以一次性安装Python、Python-Win32和其他模块,让它们在多台机器上运行?我没有访问微软系统管理工具的权限,所以我需要用一些更简单的方法。
3 个回答
你可以使用在启动时运行的批处理文件来完成以下操作:
- 挂载网络共享(也就是用
net use \\server\share
命令连接到网络上的文件夹) - 把Python和相关软件包的安装文件从网络共享复制到本地文件夹
- 检查安装的msi安装程序的版本和当前安装的版本是否一致
- 如果不一致,就卸载Python和所有依赖于版本的软件包
- 重新安装所有软件包
这基本上就是为这些软件自己搭建一个中央管理系统。
Python(更准确地说,是操作系统)通过 os.environ["PATH"] 来查找 DLL 文件,而不是通过 sys.path。
所以,你可以用一个简单的 .cmd 文件来启动 Python,这个文件会把 \server\share\python26 加入到路径中(前提是安装程序(或者你自己)把 DLL 文件从 \server\share\python26\lib\site-packages\pywin32-system32 复制到了 \server\share\python26)。
或者,你可以在你的脚本中添加以下代码,这样在尝试导入 win32api 等之前就能找到它们:
# Add Python installation directory to the path,
# because on Windows 7 the pywin32 installer fails to copy
# the required DLLs to the %WINDIR%\System32 directory and
# copies them to the Python installation directory instead.
# Fortunately, in Python it is possible to modify the PATH
# before loading the DLLs.
os.environ["PATH"] = sys.prefix + ";" + os.environ.get("PATH")
import win32gui
import win32con
在每台机器上,你基本上只需要运行一次 pywin32_postinstall.py -install
。假设你在网络上的 Python 安装路径是 N:\Python26
,那么在每台客户端上运行以下命令:
N:\Python26\python.exe N:\Python26\Scripts\pywin32_postinstall.py -install
还有一个重要的事情就是 Good Luck!
。原因是你可能需要以 admin
(管理员)的身份来执行这个操作。在我的情况下,这种设置在除了一个电脑之外的所有电脑上都能正常工作。我到现在还没搞明白为什么会这样。