1

我的目标是创建一个(或多个)可用于安装 Windows 系统服务的 .exe。目前这只是一个概念证明,所以我的所有服务都是写入文件以确认它的存在。

当我从 .py 文件调用服务时,它会安装并运行良好。当我使用 py2exe 从中生成 .exe 时,它​​会运行良好,但是我确实在 Windows 事件日志(应用程序)中收到一些消息,表明某些库未找到。有时windows在启动后会停止服务,有时windows会忽略“找不到模块”错误。所有这些都发生在 XP SP3 机器上。

当我将使用 py2exe 编译的相同 .exe 移动到 Win 7 SP1 机器时,win7 通知我 .exe 无法在没有 python27.dll 的情况下运行。所以我在.exe的cwd中移动了python27.dll,然后Win 7告诉我它无法加载.dll。当我尝试在 XP SP2 机器上运行 .exe 时,XP 告诉我无法加载该文件。

下面是对应的代码:

PySvc.py(这是实际的服务,PySvc.py install 是用于从提示符安装它的字符串:

import win32service  
import win32serviceutil  
import win32event
import servicemanager

class PySvc(win32serviceutil.ServiceFramework):  
    _svc_name_ = "PySvc"  

    _svc_display_name_ = "Python Test"  
    _svc_description_ = "Service Test"  

    def __init__(self, args):  
        win32serviceutil.ServiceFramework.__init__(self,args)  
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)  

    # Meat and potatos. This is the actual code that's run. Currently testing
    # to see behavior inside and outside of loop.
    def SvcDoRun(self):  


        f = open('test.dat', 'w+')  
        rc = None  
        f.write('OUTSIDE L00P\n')  
        # continue iteration if stop event not recieved  
        while rc != win32event.WAIT_OBJECT_0:  
            f.write('BEAUTIFUL TEST DATA NEW INSIDE L00P\n')  
            f.flush()  
            # block for 5 seconds and listen for a stop event  
            rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)  

        f.write('SHUTTING DOWN\n')  
        f.close()  

    # called on shut down      
    def SvcStop(self):  
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)  
        win32event.SetEvent(self.hWaitStop)  

if __name__ == '__main__':  
    win32serviceutil.HandleCommandLine(PySvc) 

以下是“setup.py”的代码。Setup.py py2exe 是用于创建 .exe 的字符串。

from distutils.core import setup
import py2exe





setup(
            name = 'PySvc',
            description = 'Service Test',
            version = '1.00.00',
                service = ['PySvc'],

                console = ['PySvc.py'],
                zipfile=None,
                options = {
                                "py2exe":{
                                           "includes":"win32service,win32serviceutil,win32event,servicemanager",


                                    },
                            },
    )                            

由于 .exe 在本地机器上明显成功,但在其他几台机器(没有安装 python)上失败,我目前倾向于认为这是导入或编译导入方式的问题。如果有人能提供一些关于为什么这个 .exe 不想像它应该那样表现的见解,我将永远感激不尽。感谢您的时间。

4

1 回答 1

1

如果没有更多信息,我无法 100% 确定,但是,我遇到了类似的问题。事实证明,在 Python 2.6、2.7、3.0、3.1 中,您需要自己将 c 运行时 dll 与您的包捆绑在一起。

因为您已经安装了 python,所以您可能已经安装了它。您的最终用户可能不会。您可以在 py2exe 的网站上找到有关此问题的更多信息。

于 2012-08-15T19:07:35.880 回答