【问题标题】:Python program exits immediately after startPython程序启动后立即退出
【发布时间】:2018-06-12 11:45:49
【问题描述】:

给定以下代码(在 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 &lt;Number of Lines&gt; &lt;Test Name&gt;(至少,我在双击时尝试这样做关于“Test.py”,但就像我说的那样,窗口立即关闭..

【问题讨论】:

  • 奇怪,“脚本打开一个黑色窗口,然后立即关闭”问题通常只在您双击脚本图标时出现,而不是在您从已经打开的命令提示符处执行时出现。我假设您正在这样做,因为您正在提供命令行参数......对吗? 你如何运行你的程序?
  • 你说得对,我双击脚本图标(由于压力造成的混乱,我很抱歉)。
  • 好的,所以你应该打开一个命令窗口并输入python ./Test.py &lt;Number of Lines&gt; &lt;Test Name&gt;,就像你说的那样。
  • 注意:这段代码写在一个文件中,他的名字是“Test.py” 大多数代码是由人类编写的,反之亦然。但是,嘿,很高兴认识你,机器编写的人类!
  • @WantToKnowMath 你用的是哪台机器?如果 windows - 在运行对话框中键入“cmd”并执行 python 命令,无论您在做什么。如果是 mac - 使用“iterm”。我刚刚给了这个 - MacBook-Pro Desktop $ python try.py 5 tester

标签: python python-3.6


【解决方案1】:

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

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

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

if __name__ == "__main__":
    main()

看看有没有什么不同。每当文件像脚本一样运行时,都会执行这段代码(就像您使用命令 % python Test.py &lt;num&gt; &lt;fname&gt; 所做的那样)。

【讨论】:

  • 嗯,这意味着它至少在运行脚本。这可能会发生在infhandler.write(inLine + "\n") 线上。我认为这是因为您使用open(infname, 'wb') 打开了文件。只尝试open(infname, 'w'),看看是否可行 - 区别在于wb 表示以 binary 模式打开和写入,w 表示以文本模式打开和写入 - 和python 在将您的字符串转换为二进制时遇到问题。
猜你喜欢
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2012-04-08
相关资源
最近更新 更多