March 13, 2015

在 OSX 10.10.2 Yosemite 上安裝 pygame 1.9.1 (python 2.7.8)

在 OSX 10.10.2 Yosemite (2015 Mar)上安裝 pygame 1.9.1 (python 2.7.8) 的詳細步驟。


目錄


(一) 作法一:直接從官網下載安裝檔

註:我用這個方法無法安裝成功,請自行斟酌。

  • 到 pygame 官網,找到 Macintosh 那邊,下載 pygame-1.9.1release-python.org-32bit-py2.7-macosx10.3.dmg 12MB

  • 下載後點兩下開啟 dmg 檔案,會出現 pygame-1.9.1release-python.org-32bit-py2.7-macosx10.3.mpkg

  • 直接點兩下 mpkg 檔會出現無法認證開發者,所以無法開啟該檔案。

  • 按住 option,並在 mpkg 檔按右鍵叫出選單,點選開啟,這招可以繞過驗證。

  • 在安裝畫面按下一步,然後就會出現 python 1.9.1 release 無法安裝在此磁碟上。pygames requires System Python 2.7 to install.

開啟 iTerm 看看,我的系統裡明明就有安裝 python 2.7 啊..

$ python --version
Python 2.7.6

到處找資料,找到遇到一樣問題的 這篇文章這篇討論,於是衍伸出下面兩種解決方法。


(二) 作法二:使用 Homebrew 安裝 pygame

1. 安裝 Homebrew 與 XQuartz

首先安裝 Homebrew - OS X 缺少的套件管理工具

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma
ster/install)"

然後用 Homebrew 安裝 XQuartz

這篇討論 得知 Homebrew is unable to ship XQuartz,但是 xquartz is available from caskroom。所以我們從 caskroom 安裝 xquartz。

brew install Caskroom/cask/xquartz

2. Homebrew 安裝 pygame 的指令

安裝完 XQuartz 後,從 這篇討論 得知在 OSX 上用 Homebrew 安裝 pygame 的指令。

下面兩個方法都可以,不過我選擇後者,順便更新一下 python。

A. 在 OSX 原有的 python 上用 Homebrew 安裝 pygame:

brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
sudo pip install hg+http://bitbucket.org/pygame/pygame
# --
# 第一行用 homebrew 安裝 pygame 依存檔。
# 第二行用內建之 python 的 pip 工具下載並安裝 pygame。

B. 用 Homebrew 先安裝 python 再安裝 pygame:

brew install python
brew install sdl sdl_image sdl_mixer sdl_ttf portmidi
/usr/local/share/python/pip install hg+http://bitbucket.org/pygame/pygame
# --
# 第一行用 homebrew 安裝 python。
# 第二行用 homebrew 安裝 pygame 依存檔。
# 第三行用剛剛安裝之 python 的 pip 工具下載並安裝 pygame。
# 第三行的 /usr/local/share/python/pip 應為剛安裝的 python 之安裝路徑,
# 例如 Homebrew 預設裝在 /usr/local/Cellar/python/2.7.8/bin/pip

想了解更多有關 python 的 pip 工具請參考 這篇文章

3. 可能遇到的錯誤

看完指令後,實際來裝裝看。

首先透過 Homebrew 安裝 pyhton。

cchien:~ $ brew install python

==> Installing dependencies for python: sqlite, gdbm, makedepend
==> Installing python dependency: sqlite
==> Downloading http://sqlite.org/2014/sqlite-autoconf-3080500.tar.gz
...
...(略)
...
Run `brew linkapps` to symlink these to /Applications.
==> /usr/local/Cellar/python/2.7.8/bin/python -s setup.py --no-user-cfg install
==> /usr/local/Cellar/python/2.7.8/bin/python -s setup.py --no-user-cfg install
==> Summary
/usr/local/Cellar/python/2.7.8: 5979 files, 95M, built in 4.8 minutes

接著透過 Homebrew 安裝 pygame 依存檔。

cchien:~ $ brew install sdl sdl_image sdl_mixer sdl_ttf portmidi

==> Downloading http://www.libsdl.org/release/SDL-1.2.15.tar.gz
######################################################################## 100.0%
==> Downloading http://bugzilla-attachments.libsdl.org/attachment.cgi?id=1320
######################################################################## 100.0%
...
...(略)
...
==> Patching
patching file pm_common/CMakeLists.txt
==> make -f pm_mac/Makefile.osx
==> make -f pm_mac/Makefile.osx install
/usr/local/Cellar/portmidi/217: 7 files, 104K, built in 9 seconds

接下來用 python 的 pip 工具下載 pygame。

但是不論是 OSX 內建的 python,還是剛剛 Homebrew 下載的 python,都無法順利下載 pygame。

sudo pip install hg+http://bitbucket.org/pygame/pygame
或
sudo /usr/local/Cellar/python/2.7.8/bin/pip install hg+http://bitbucket.org/pygame/pygame

皆會出現下列錯誤訊息。

Downloading/unpacking hg+http://bitbucket.org/pygame/pygame
  Cloning hg http://bitbucket.org/pygame/pygame to /tmp/pip-vODDJh-build
Cleaning up...
Cannot find command 'hg'
Storing debug log for failure in /Users/cchien/.pip/pip.log

檢查一下錯誤訊息,原來是系統不認識 ‘hg’ 這個指令。

在跳槽 Git 之前,我曾經用了一段時間的 Mercurial,對 hg 這詞有一定的敏感度。

反射動作:既然不認識 hg ,那就先裝 Mercurial 吧。

cchien:~ $ brew install mercurial

==> Downloading http://mercurial.selenic.com/release/mercurial-3.0.2.tar.gz
######################################################################## 100.0%
==> make PREFIX=/usr/local/Cellar/mercurial/3.0.2 install-bin
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
/usr/local/Cellar/mercurial/3.0.2: 535 files, 7.7M, built in 21 seconds

然後再次用 python 的 pip 工具下載 pygame。

sudo pip install hg+http://bitbucket.org/pygame/pygame
或
sudo /usr/local/Cellar/python/2.7.8/bin/pip install hg+http://bitbucket.org/pygame/pygame

終於順利安裝完成了!

Successfully installed pygame
Cleaning up...

(三) 作法三:下載 source code 自己編譯

如果上述方法都行不通的話,也可以選擇自己 build source code。

我沒選擇這個方式,因為依存檔沒用套件管理感覺很雜亂,且文件內沒有 YOSEMITE 版本的安裝方式,感覺毛毛 der。


(四) 簡單程式測試 pygame

終於在 OSX 10.10.2 YOSEMITE 安裝好 pygame,馬上拿個簡單程式測試看看。

1. 範例程式碼

以下範例程式碼來自 https://inventwithpython.com/pygame/chapter2.html

import pygame, sys
from pygame.locals import *

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Hello World!')
while True: # main game loop
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

2. 編譯錯誤,ImportError: No module named locals

速度編譯一下程式,馬上出現錯誤。

cchien:~ $ python pygame.py
Traceback (most recent call last):
  File "pygame.py", line 1, in <module>
    import pygame, sys
  File "/Users/cchien/pygame.py", line 2, in <module>
    from pygame.locals import *
ImportError: No module named locals

錯誤訊息居然說找不到 module name,該不會是 pygame 沒有安裝成功吧?

查了 資料 後才發現,原來我把檔名命名為 pygame.py,才導致這個錯誤。

寫了這麼多年的程式,還是出現最簡單的 Namespace 失誤,嗚嗚。

將檔名重新命名為 apple.py 後編譯,還是出現一樣的錯誤!

cchien:~ $ python apple.py
Traceback (most recent call last):
  File "apple.py", line 1, in <module>
    import pygame, sys
  File "/Users/cchien/pygame.py", line 2, in <module>
ImportError: No module named locals

到資料夾看,原來剛編譯時產生了 pygame.pyc,導致系統 import 錯檔案,刪掉後就可正常編譯了。

編譯完成後,終於在 OSX 10.10.2 產生了第一個 pygame 程式。

3. 進階範例

以下範例程式碼一樣來自 https://inventwithpython.com/pygame/chapter2.html

在資料夾內放一張小圖片(約 100*100),取名做 cat.png,程式碼 test.py 如下:

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 30 # frames per second setting
fpsClock = pygame.time.Clock()

# set up the window
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption('Animation')

WHITE = (255, 255, 255)
catImg = pygame.image.load('cat.png')
catx = 10
caty = 10
direction = 'right'

while True: # the main game loop
    DISPLAYSURF.fill(WHITE)

    if direction == 'right':
        catx += 5
        if catx == 280:
            direction = 'down'
    elif direction == 'down':
        caty += 5
        if caty == 220:
            direction = 'left'
    elif direction == 'left':
        catx -= 5
        if catx == 10:
            direction = 'up'
    elif direction == 'up':
        caty -= 5
        if caty == 10:
            direction = 'right'

    DISPLAYSURF.blit(catImg, (catx, caty))

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

    pygame.display.update()
    fpsClock.tick(FPS)

然後編譯 test.py。

python test.py

這兩個範例都能順利執行的話,代表 pygame 已順利安裝完成惹。


(五) 參考資料 Reference