首页 > 解决方案 > Python程序启动后立即退出

问题描述

给出以下代码(在python中):

import random
import sys
import collections

commandStr = ["addClan", "addPlayer",
              "clanFight", "getMinClan"]

SUCCESS = "SUCCESS"
FAILURE = "FAILURE"
INVALID_INPUT = "INVALID_INPUT"

ClanID = dict()
playersID = dict()
ClanScore = collections.defaultdict(list)
playersClan = dict()
LosingClans = set()

Clans_count = 0;
players_count = 0;


def initline():
    global ClanID, Clans_count
    inLine = "init 2 0 1"
    outLine = "init done."
    ClanID[0] = {}
    ClanID[1] = {}
    Clans_count += 2
    return inLine, outLine


# addClan clanID
def addClan():
    global ClanID, Clans_count
    clanID = random.randint(-2, 8)
    inLine = "addClan %d" % (clanID)
    outLine = "addClan: "
    if clanID < 0:
        outLine += INVALID_INPUT
    elif clanID in ClanID.keys():
        outLine += FAILURE
    else:
        ClanID[clanID] = {}
        Clans_count += 1
        outLine += SUCCESS
    return inLine, outLine

# addPlayer playerID score clanID
def addPlayer():
    global playersID, ClanID, ClanScore, playersClan, players_count
    playerID = random.randint(-10, 1000)
    score = random.randint(-10, 1000)
    clanID = random.randint(-2, 8)
    inLine = "addPlayer %d %d %d" % (playerID, score, clanID)
    outLine = "addPlayer: "
    if playerID < 0 or clanID < 0 or score <0:
        outLine += INVALID_INPUT
    elif playerID in playersID.keys() or clanID not in ClanID.keys():
        outLine += FAILURE
    else:
        playersID[playerID] = playerID
        if clanID in ClanScore.keys():
            ClanScore[clanID].append(score)
        else:
            ClanScore[clanID] = [score]
        playersClan[playerID] = clanID
        ClanID[clanID][playerID] = (playersID[playerID], clanID)
        players_count += 1
        outLine += SUCCESS
    return inLine, outLine

# getMinClan
def getMinClan():
    global ClanID, LosingClans
    inLine = "getMinClan"
    outLine = "getMinClan: "
    for Clan_id in sorted(ClanID):
        if Clan_id not in LosingClans:
            outLine += SUCCESS + " %d" % Clan_id
            break           
    return inLine, outLine

def sum_n_strongest(Clan, num):
    sortedClan = sorted(Clan, reverse=True)
    topNum = sortedClan[:num]
    Sum = 0
    for element in topNum:
        Sum += element
    return Sum

# clanFight clan1 clan2 k1 k2
def clanFight():
    global ClanID, ClanScore, LosingClans
    clan1 = random.randint(-1, 8)
    clan2 = random.randint(-1, 8)
    k1 = random.randint(-1, 10)
    k2 = random.randint(-1, 10)
    inLine = "clanFight %d %d %d %d" % (clan1, clan2, k1, k2)
    outLine = "clanFight: "
    if k1 <= 0 or k2 <= 0 or clan1 < 0 or clan2 < 0:
        outLine += INVALID_INPUT
    elif clan1 not in ClanID.keys() or clan2 not in ClanID.keys() or clan1 == clan2 or len(ClanID[clan1]) < k1 or len(ClanID[clan2]) < k2:
        outLine += FAILURE
    elif clan1 in LosingClans or clan2 in LosingClans:
        outLine += FAILURE
    else:
        sum1 = sum_n_strongest(ClanScore[clan1], k1)
        sum2 = sum_n_strongest(ClanScore[clan2], k2)
        if sum1 == sum2:
            if clan1 < clan2:
                LosingClans.add(clan2)
            else:
                LosingClans.add(clan1)
        elif sum1 < sum2:
            LosingClans.add(clan1)
        else:
            LosingClans.add(clan2)
        outLine += SUCCESS
    return inLine, outLine

def main():
    if len(sys.argv) < 3:
        print("Usage %s <lines>" % sys.argv[0])
        exit(0)
    lines = int(sys.argv[1])
    infname = "%s.in" % sys.argv[2]
    outfname = "%s.out" % sys.argv[2]
    functions = [addClan, addPlayer,
                 getMinClan, clanFight]
    with open(infname, 'wb') as infhandler:
        with open(outfname, 'wb') as outfhandler:
            inLine, outLine = initline()
            infhandler.write(inLine + "\n")
            outfhandler.write(outLine + "\n")
            while lines > 0:
                f = random.randint(0, len(functions)-1)
                func = functions[f]
                inLine, outLine = func()
                if inLine is not "":
                    infhandler.write(inLine + "\n")
                    outfhandler.write(outLine + "\n")
                    lines -= 1
            infhandler.write("quit\n")
            outfhandler.write("quit done.\n")


main()

此代码应创建一个新文件,而我需要提供参数filenamenumberOfLines.
但是,当我尝试运行此脚本时,向我打开了一个黑色窗口(如 cmd)并立即关闭。

我该如何解决?有人知道是什么问题吗?

注意:这段代码把我写在一个他的名字是“Test.py”的文件中,我试图用这个行命令运行它:( python ./Test.py <Number of Lines> <Test Name>至少,我在双击“Test.py”时尝试这样做但就像我说的那样,窗户立即关闭..

标签: pythonpython-3.6

解决方案


后续问题:您使用的是 IDE,还是尝试从命令行/命令提示符运行它?

首先,在运行程序后检查文件是否存在。可能只是程序运行得足够快,只需要几毫秒,一旦程序终止,命令提示符就会消失。如果它确实创建了一个文件,程序不会向外通知您;查看您的文件目录,看看是否有。

其次,不要只是main()在文件末尾调用,而是尝试:

if __name__ == "__main__":
    main()

看看是否会发生任何不同的事情。每当文件像脚本一样运行时(正如您使用 command 所做的那样),都会执行这段代码% python Test.py <num> <fname>


推荐阅读