为什么这个Python代码在Ubuntu上是段错误的,而不是在Windows上?

时间:2012-07-14 17:33:32

标签: python windows ubuntu segmentation-fault pygame

我为我的个人Python项目编写了一个简单的(我认为)starfield动画。关于游戏进入“可玩”阶段的时间,我决定开展另一个项目;用Windows / Ubuntu双启动实验。虽然Windows / Ubuntu实验的细节是一个真正的页面翻转,但相关的问题更多的是,“为什么这个代码在Windows XP上正常工作但在Ubuntu 12.04上导致各种崩溃”?

此代码是使用Pygame 1.9为Python 2.7编写的。

import pygame, random, sys
from pygame import *

pygame.init()

width = 400
height = 400
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)


DISPLAYSURF = pygame.display.set_mode((width, height))

stars = 50
starfield = []

for i in range(stars):
    x = random.randrange(0, width)
    y = random.randrange(0, height)
    starfield.append([x, y])

clock = pygame.time.Clock()
FPS = 60

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
           pygame.quit()
           sys.exit()

DISPLAYSURF.fill(BLACK)

starCounter = 0
for star in starfield:
    starCounter += 1
    x, y = star
    starDraw = pygame.PixelArray(DISPLAYSURF)
    starDraw[x][y] = WHITE
    del starDraw

            #fake parallax scrolling effect
    star[1] += 1
    if starCounter % 3 == 1:
        star[1] += 1

    if starCounter % 5 == 1:
        star[1] += 1

    if star[1] > height:
        star[0] = random.randrange(0, width)
        star[1] = 0

最终我通过用surface.set_at()替换PixelArray废话来解决这个问题,并删除了与实例化PixelArray对象相关的所有代码。但它不仅仅是段落(Pygame降落伞变种),我会得到各种奇怪的错误信息;关于gcclibrary的一些事情,关于malloc()等的事情。请记住,我以前没有使用任何IDLE或类似的东西;我总是从命令行和/或终端运行所有内容。

我曾经历过的那种错误并不一定与我有关;事实上Windows会让他们沉默,而Ubuntu非常乐意指出并嘲笑他们。显然,这一定是PEBKAC的结果,但为什么在地球上Windows会保留这些信息呢?而在这个论点的另一面;在Ubuntu下编码会原谅一种不同的坏习惯吗?如果Windows沉默某些类型的段错误,Ubuntu是否会捕获一组不同的错误,我是否真的需要注意每个主要操作系统可能决定捕获或未捕获的所有不同的goofball错误?我只是在这里工作了大约一年,所以有很多信息我只是曝光不足而且没有意识到。

我的意思是,我想如果你想向我展示我的旧代码的错误,以防我觉得创建PixelArray对象是我将来需要做的事情,我也不介意。 :)

1 个答案:

答案 0 :(得分:1)

您提供的代码可以在我的机器上崩溃(Ubuntu 11.10,Python 2.7.2)。如果我注释掉while True块以便后面的代码(PixelArray等)运行,它也可以工作。由于没有显示循环或任何东西,除了短暂弹出的黑色窗口外没有显示任何内容,但没有任何例外。

Windows下的Python不会隐藏段错误等,Ubuntu设置有问题。我怀疑这是三件事之一:

  1. 您的Ubuntu计算机上的Python安装已损坏。
  2. pygame(或相关库)的安装已损坏。
  3. 一些已编译的代码已从Windows复制并在Ubuntu下运行时导致问题(不太可能,因为我希望它拒绝完全运行而不是开始运行然后引发问题,但我扔了它只是为了以防万一)。
  4. 如果你编辑你的问题以包含错误的完整追溯,那么有人可能会弄清楚事情的确切位置。