python 应用转 exe 在 WinSRV2003 上不工作

2 投票
4 回答
2587 浏览
提问于 2025-04-15 15:51

我做了一个小应用,用来在服务器出现问题时发送邮件。我用py2exe把它打包成了exe文件。在Windows 7上运行得很好,但在Windows Server 2003上就有问题。我觉得这和代码本身没关系。

下面是我用到的导入模块:

import pyodbc, sys, smtplib, os
from datetime import date
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
import email.iterators
import email.generator

这是我的setup.py文件:

from distutils.core import setup
import py2exe
import modulefinder

modulefinder.AddPackagePath("mail.mime", "base")
modulefinder.AddPackagePath("mail.mime", "multipart")
modulefinder.AddPackagePath("mail.mime", "nonmultipart")
modulefinder.AddPackagePath("mail.mime", "audio")
modulefinder.AddPackagePath("mail.mime", "image")
modulefinder.AddPackagePath("mail.mime", "message")
modulefinder.AddPackagePath("mail.mime", "application")

setup(console=['capfile_tester.py'],
    options = { "py2exe": { "includes": "decimal, datetime, email" } })

还有一条来自py2exe输出的信息,可能会有用:

以下模块似乎缺失:['_scproxy']

当我尝试启动应用时,出现的错误信息是:

这个应用程序启动失败,因为应用程序配置不正确。重新安装应用程序可能会解决这个问题。

我在想,是否缺少了一些注册表项,导致应用无法运行呢?

4 个回答

1

在网上搜索“这个应用程序无法启动...”的提示,基本上可以确定是DLL的问题,可能是和msvcp80.dll相关的文件。这个问题在最近的Windows、Python和py2exe中非常常见,因为微软一直在更改MSVCC库等内容。不同版本的Python会链接到不同的库,如果你的目标机器上没有预先安装这些库,就可能会出现这样的错误。有时候,安装微软提供的合适的可再分发包可以解决这个问题。

需要注意的是,py2exe发出的关于_scproxy的警告几乎总是可以忽略的。出现这种缺失模块的虚假报告是非常常见的。95%的情况下,我们可以忽略这些警告,即使我们看到有好几十个模块“缺失”。

1

在网上搜索一下 _scproxy,好像发现它是2.6版本中的一个新模块。也许和Python 2.5有点关系?不过,py2exe应该可以把程序打包成一个完全独立的可执行文件,所以我不太明白这怎么可能。

还有一种可能是,_scproxy依赖于一个在Windows 2003上不可用的dll文件?你有没有试过在Win2003上不使用py2exe运行你的程序?

1

我觉得这可能是缺少DLL文件的问题。你应该检查一下你的应用程序打包了哪些DLL文件(或者假设在目标电脑上存在的那些文件)。我想你可以用Visual Studio自带的depends.exe来查看。

补充一下:我刚想起来,确保你是在Python 2.5的环境下运行py2exe。因为2.6版本有一些bug,这导致生成的exe在很多机器上无法正常工作。

撰写回答