pyinstaller .exe构建在启动后立即停止,没有错误

问题描述

我对算法世界是陌生的。我使用python创建了我的第一个NEAT AI。这最初是用于学校项目的,但是学校不允许我们在计算机上安装任何软件。因此,我想从.py文件制作一个.exe文件。我已经做过几次了,但是这次没有用。我猜是因为它涉及NEAT。如果有人感兴趣,这是我使用的代码(带有AI的飞扬的小鸟):

const obj = {
    color: 'blue',index: 1,exists: false
};
type MyObject = typeof obj;
const myFunction = (prop: MyObject[keyof MyObject]) => {
    //doSomething
}

当我运行.exe文件时,将出现控制台,并显示

import pygame
import neat
import time
import os
import random
pygame.font.init()

WIN_WIDTH = 500
WIN_HEIGHT = 800

GEN = 0

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load("bird1.png")),pygame.transform.scale2x(pygame.image.load("bird2.png")),pygame.transform.scale2x(pygame.image.load("bird3.png"))]

PIPE_IMG = pygame.transform.scale2x(pygame.image.load("pipe.png"))
BASE_IMG = pygame.transform.scale2x(pygame.image.load("base.png"))
BG_IMG = pygame.transform.scale2x(pygame.image.load("bg.png"))

STAT_FONT = pygame.font.SysFont("comicsans",50)

class Bird:
IMGS = BIRD_IMGS
MAX_ROTATION = 25
ROT_VEL = 25
ANIMATION_TIME = 5

def __init__(self,x,y):
    self.x = x
    self.y = y
    self.tilt = 0
    self.tick_count = 0
    self.vel = 0
    self.height = self.y
    self.img_count = 0
    self.img = self.IMGS[0]

def jump(self):
    self.vel = -10.5
    self.tick_count = 0
    self.height = self.y

def move(self):
    self.tick_count += 1

    d = self.vel*self.tick_count + 1.5*self.tick_count**2

    if d >= 16:
        d = 16

    if d < 0:
        d -= 2

    self.y = self.y + d

    if d < 0 or self.y < self.height + 50:
        if self.tilt < self.MAX_ROTATION: 
            self.tilt = self.MAX_ROTATION
    else:
        if self.tilt > -90:
            self.tilt -= self.ROT_VEL

def draw(self,win):
    self.img_count += 1

    if self.img_count < self.ANIMATION_TIME:
        self.img = self.IMGS[0]
    elif self.img_count < self.ANIMATION_TIME*2:
        self.img = self.IMGS[1]
    elif self.img_count < self.ANIMATION_TIME*3:
        self.img = self.IMGS[2]
    elif self.img_count < self.ANIMATION_TIME*4:
        self.img = self.IMGS[1]
    elif self.img_count == self.ANIMATION_TIME*4 + 1:
        self.img = self.IMGS[0]
        self.img_count = 0

    if self.tilt <= -80:
        self.img = self.IMGS[1]
        self.img_count = self.ANIMATION_TIME*2

    rotated_image = pygame.transform.rotate(self.img,self.tilt)
    new_rect = rotated_image.get_rect(center=self.img.get_rect(topleft= (self.x,self.y)).center)
    win.blit(rotated_image,new_rect.topleft)

def get_mask(self):
    return pygame.mask.from_surface(self.img)


class Pipe:
GAP = 200
VEL = 5

def __init__(self,x):
    self.x = x
    self.height = 0

    self.top = 0
    self.bottom = 0
    self.PIPE_TOP = pygame.transform.flip(PIPE_IMG,False,True)
    self.PIPE_BottOM = PIPE_IMG

    self.passed = False
    self.get_height()

def get_height(self):
    self.height = random.randrange(50,450)
    self.top = self.height - self.PIPE_TOP.get_height()
    self.bottom = self.height + self.GAP

def move(self):
    self.x -= self.VEL

def draw(self,win):
    win.blit(self.PIPE_TOP,(self.x,self.top))
    win.blit(self.PIPE_BottOM,self.bottom))

def collide(self,bird):
    bird_mask = bird.get_mask()
    top_mask = pygame.mask.from_surface(self.PIPE_TOP)
    bottom_mask = pygame.mask.from_surface(self.PIPE_BottOM)

    top_offset = (self.x - bird.x,self.top - round(bird.y))
    bottom_offset = (self.x - bird.x,self.bottom - round(bird.y))

    b_point = bird_mask.overlap(bottom_mask,bottom_offset)
    t_point = bird_mask.overlap(top_mask,top_offset)

    if t_point or b_point:
        return True

    return False

class Base:
VEL = 5
WIDTH = BASE_IMG.get_width()
IMG = BASE_IMG

def __init__(self,y):
    self.y = y
    self.x1 = 0
    self.x2 = self.WIDTH

def move(self):
    self.x1 -= self.VEL
    self.x2 -= self.VEL

    if self.x1 + self.WIDTH < 0:
        self.x1 = self.x2 + self.WIDTH

    if self.x2 + self.WIDTH < 0:
        self.x2 = self.x1 + self.WIDTH

def draw(self,win):
    win.blit(self.IMG,(self.x1,self.y))
    win.blit(self.IMG,(self.x2,self.y))


def draw_window(win,birds,pipes,base,score,gen):
win.blit(BG_IMG,(0,0))

for pipe in pipes:
    pipe.draw(win)

text = STAT_FONT.render("Pontok: " + str(score),1,(255,255,255))
win.blit(text,(WIN_WIDTH - 10 - text.get_width(),10))

text = STAT_FONT.render("Generáció: " + str(gen),(10,10))

base.draw(win)
for bird in birds:
    bird.draw(win)

pygame.display.update()

def main(genomes,config):
global GEN 
GEN += 1
nets = []
ge = []
birds = []

for _,g in genomes:
    net = neat.nn.FeedForwardNetwork.create(g,config)
    nets.append(net)
    birds.append(Bird(230,350))
    g.fitness = 0
    ge.append(g)

score = 0
base = Base(730)
pipes = [Pipe(600)]
win = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
clock = pygame.time.Clock()

run = True
while run: 
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            quit()

    pipe_ind = 0
    if len(birds) > 0:
        if len(pipes) > 1 and birds[0].x > pipes[0].x + pipes[0].PIPE_TOP.get_width():
            pipe_ind = 1
    else:
        run = False
        break

    for x,bird in enumerate(birds):
        bird.move()
        ge[x].fitness += 0.1

        output = nets[x].activate((bird.y,abs(bird.y - pipes[pipe_ind].height),abs(bird.y - pipes[pipe_ind].bottom)))

        if output[0] > 0.5:
            bird.jump()

    add_pipe = False
    rem = []
    base.move()
    for pipe in pipes:
        for x,bird in enumerate(birds):        
            if pipe.collide(bird):
                ge[x].fitness -= 1
                birds.pop(x)
                nets.pop(x)
                ge.pop(x)

            if not pipe.passed and pipe.x < bird.x:
                pipe.passed = True
                add_pipe = True

        if pipe.x + pipe.PIPE_TOP.get_width() < 0:
            rem.append(pipe)

        pipe.move()

    if add_pipe:
        score += 1
        for g in ge:
            g.fitness += 5
        pipes.append(Pipe(600))

    for r in rem:
        pipes.remove(r)

    for x,bird in enumerate(birds):
        if bird.y + bird.img.get_height() >= 730 or bird.y < 0:
            birds.pop(x)
            nets.pop(x)
            ge.pop(x)

    draw_window(win,GEN)

def run(config_path):
config = neat.config.Config(neat.DefaultGenome,neat.DefaultReproduction,neat.DefaultSpeciesSet,neat.DefaultStagnation,config_path)

p = neat.Population(config)
p.add_reporter(neat.StdOutReporter(True))
stats = neat.StatisticsReporter()
p.add_reporter(stats)

winner = p.run(main,20)

if __name__ == "__main__":
local_dir = os.path.dirname(__file__)
config_path = os.path.join(local_dir,"config_Feedforward.txt")
run(config_path)

然后停止。

当我运行.py文件时,它将正常启动AI并显示类似以下内容

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html

我使用的pyinstaller命令:

******* Running Generation 1 *******

我尚未找到任何解决方案,并且已经浏览了2天。

从cmd运行它时,我没有任何错误。在构建时,我还会在pyinstaller中收到一些“找不到隐藏的导入”警告,但我认为这应该不是问题。

我已经尝试通过引用/ imgs库和config-Feedforward.txt来尝试,但是它也不起作用。任何帮助表示赞赏。对不起任何错字或英语不好。

祝你有美好的一天!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)