2017/09/03(日) [n年前の日記]
#1 [python][windows][pi3d] Windows10 x64上に pi3d をインストールしてみたり
Windows上でも
_pi3d
はインストールできるらしいので試してみた。
_Introduction to pi3d - pi3d 2.20 documentation
環境は Windows10 x64 + Python 2.7.13 or Python 3.5.4。
_Introduction to pi3d - pi3d 2.20 documentation
環境は Windows10 x64 + Python 2.7.13 or Python 3.5.4。
> python --version Python 2.7.13 > py -2 --version Python 2.7.13 > py -3 --version Python 3.5.4
◎ 動作に必要なモジュールをインストール。 :
pi3dをWindows上で動かすには以下のモジュールも必要になるらしい。
現時点では pip でインストールできる。
最後に pi3d をインストール。
pygame Pillow numpy
現時点では pip でインストールできる。
pip install pygame pip install Pillow pip install numpy
最後に pi3d をインストール。
pip install pi3d
pip listと打てばインストール済みモジュールの一覧が表示されるので、インストールできたか確認できるはず。
◎ デモスクリプト群 pi3d_demos を入手。 :
_pi3d/pi3d_demos: Demos and support files for pi3d
git を使って持ってくる。
あるいは、zipをダウンロードして解凍してもいい。 _pi3d/pi3d_demos の、右上のほうの緑のボタン、「Clone or download」→「Download zip」をクリックすれば、zipファイルとしてダウンロードできる。
git を使って持ってくる。
git clone https://github.com/pi3d/pi3d_demos.git
あるいは、zipをダウンロードして解凍してもいい。 _pi3d/pi3d_demos の、右上のほうの緑のボタン、「Clone or download」→「Download zip」をクリックすれば、zipファイルとしてダウンロードできる。
◎ ANGLEの入手。 :
pi3dをWindows上で動かすためには、OpenGL ES をエミュレートするANGLEなるものが ―― 3〜4ファイルの .dllファイルが必要になるらしい。
入手方法はいくつかあるようで。
その1。 _paddywwoof/pi3d_windll からzipでダウンロードして解凍。中に入ってる dllファイルを使わせてもらう方法。
その2。Mozilla Firefox のインストールフォルダ、
その3。Google Chrome のインストールフォルダ、
動作に必要なファイルは3〜4ファイル。
これらのファイルを、動かしたいスクリプトと同じ階層に置く。例えば pi3d_demos を動かしたいなら、pi3d_demosフォルダの中にコピーする。
Pythonが32bit版なら、32bit版用のdllを、Pythonが64bit版なら、64bit版のdllを用意する。
ちなみに自分の環境では、 _paddywwoof/pi3d_windll の32bit版dll、あるいは Firefoxのソレが使えて、Google Chromeのソレは使えなかった。
入手方法はいくつかあるようで。
その1。 _paddywwoof/pi3d_windll からzipでダウンロードして解凍。中に入ってる dllファイルを使わせてもらう方法。
その2。Mozilla Firefox のインストールフォルダ、
C:\Program Files (x86)\Mozilla Firefox\から、該当する .dll をコピーしてくる方法。
その3。Google Chrome のインストールフォルダ、
C:\Program Files (x86)\Google\Chrome\Application\バージョン番号\からコピーしてくる方法。
動作に必要なファイルは3〜4ファイル。
libegl.dll libglesv2.dll d3dcompiler_47.dll # 最後の数字は違ってる可能性有 mozglue.dll # Mozilla Firefox のみ必要
これらのファイルを、動かしたいスクリプトと同じ階層に置く。例えば pi3d_demos を動かしたいなら、pi3d_demosフォルダの中にコピーする。
Pythonが32bit版なら、32bit版用のdllを、Pythonが64bit版なら、64bit版のdllを用意する。
ちなみに自分の環境では、 _paddywwoof/pi3d_windll の32bit版dll、あるいは Firefoxのソレが使えて、Google Chromeのソレは使えなかった。
◎ デモスクリプトの実行。 :
pi3d_demos の Earth.py を動かしてみる。
ところが。Python 3.5 ならどうか。
どうやら現時点では、Windows + Python + pi3d は、 Python 3.x でしか動かないようだなと。
cd pi3d_demos python Earth.py
D:\home\prg\python\_test_sample\pi3d\pi3d_demos\pi3d_demos> python Earth.py Traceback (most recent call last): File "Earth.py", line 11, in <module> import pi3d File "C:\Python\Python27\lib\site-packages\pi3d\__init__.py", line 10, in <module> from pi3d.constants import * File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 167, in <module> PLATFORM, bcm, openegl, opengles = _detect_platform_and_load_libraries() File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 160, in _detect_platform_and_load_libraries platform, bcm, openegl, opengles = loader() File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 139, in _windows opengles = _load_library("libglesv2.dll", "Win") File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 77, in _load_library Log.logger(__name__).error("Couldn't load library %s", name) AttributeError: 'module' object has no attribute 'logger'Python 2.7 上で試したらエラーが出て動かない…。libglesv2.dll を見つけ出すところで処理に失敗してる模様。
ところが。Python 3.5 ならどうか。
> py -3 Earth.pyこっちだと動いてしまった。地球と月がWindows上でもクルクル回ってる。
どうやら現時点では、Windows + Python + pi3d は、 Python 3.x でしか動かないようだなと。
◎ どうしてエラーが出るのか謎。 :
Python 2.7で動かそうとした場合、
_pi3d/constants/__init__.py
でエラーが出るわけだけど。ソースを眺めても、これでどうしてエラーが出るのか分からない。
pi3d_demosフォルダ内に _mydemo.py というファイルを作って動作確認してみた。
__mydemo.py
なのに、pi3d/constants/__init__.py を呼び出すとエラーになってしまう。何故? どうして?
もし、Python 2.7同梱の ctypes のバグだったら、どっちもエラーが出るはずだよな…。なのに、片方はエラーで、片方は動く…。
Python 3.5 では動いてしまうのも謎。何故。
pi3d_demosフォルダ内に _mydemo.py というファイルを作って動作確認してみた。
__mydemo.py
import sys # sys.path.insert(1, '/home/pi/pi3d') import ctypes def _load_library(name, dll_type="C"): if name: try: if dll_type == "Win": return ctypes.WinDLL(name) else: return ctypes.CDLL(name) except: print("Couldn't load library %s" % name) opengles = _load_library("libglesv2.dll", "Win") openegl = _load_library("libegl.dll", "Win") print(opengles) print(openegl)
> python _mydemo.py <WinDLL 'libglesv2.dll', handle 5ae30000 at 3467cd0> <WinDLL 'libegl.dll', handle 5daa0000 at 3467db0>ちゃんとdllを見つけることができてる。pi3d/constants/__init__.py をコピペして動かしてみたのに問題が出ていない。
なのに、pi3d/constants/__init__.py を呼び出すとエラーになってしまう。何故? どうして?
もし、Python 2.7同梱の ctypes のバグだったら、どっちもエラーが出るはずだよな…。なのに、片方はエラーで、片方は動く…。
Python 3.5 では動いてしまうのも謎。何故。
◎ エラーが出る原因が分かった。 :
Python 2.7.13 のバグらしい。
_TypeError: LoadLibrary() argument 1 must be string, not unicode - Issue #147 - carlosperate/ardublockly
_Issue 29082: In 2.7.13, _ctypes.LoadLibrary no longer accepts Unicode objects - Python tracker
_ctypes - TypeError when importing ghostscript on Python - Stack Overflow
ctypes.WinDLL() に渡すべき文字列の種類が、Python 2.7.13 と Python 3.x では違ってしまっているらしい。Unicode文字列だか、バイト文字列だか…。
例えば、pi3d/constants/__init__.py の _load_library() を、以下のように書き換えるとエラーメッセージが変わってくる。
Python 2.7.13 で動かした場合。
Python 2.7.13 で動くように修正してみると…。
しかし、同じ修正をしたものを Python 3.5.4 で動かしてみると。
Python 2.7.13 と Python 3.5.4 で、エラーメッセージが違ってる…。LoadLibrary() に与えるべき文字列の種類が違うという。
解決策としては…。英語圏のやり取りを眺めると「Python 2.7.12 にダウングレードしろ」「もしくは Python 3.x を使え」ということになってるっぽいな…。
Python 2.7.13 は _結構色々修正されてる っぽいから、できれば 2.7.13 のほうがいいのではと思えてくるけど、しかし、こういう不具合があるのでは…。ていうか去年の年末に報告されてたのに、修正版はまだ出ないのか…。
_TypeError: LoadLibrary() argument 1 must be string, not unicode - Issue #147 - carlosperate/ardublockly
_Issue 29082: In 2.7.13, _ctypes.LoadLibrary no longer accepts Unicode objects - Python tracker
_ctypes - TypeError when importing ghostscript on Python - Stack Overflow
ctypes.WinDLL() に渡すべき文字列の種類が、Python 2.7.13 と Python 3.x では違ってしまっているらしい。Unicode文字列だか、バイト文字列だか…。
例えば、pi3d/constants/__init__.py の _load_library() を、以下のように書き換えるとエラーメッセージが変わってくる。
def _load_library(name, dll_type="C"): """Try to load a shared library, report an error on failure.""" if name: try: if dll_type == "Win": return ctypes.WinDLL(name) else: return ctypes.CDLL(name) except: from pi3d.util import Log Log.logger(__name__).error("Couldn't load library %s", name)↓
def _load_library(name, dll_type="C"): """Try to load a shared library, report an error on failure.""" if name: if dll_type == "Win": return ctypes.WinDLL(name) else: return ctypes.CDLL(name)
Python 2.7.13 で動かした場合。
> python Earth.py Traceback (most recent call last): File "Earth.py", line 11, in <module> import pi3d (中略) File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 72, in _load_library return ctypes.WinDLL(name) File "C:\Python\Python27\lib\ctypes\__init__.py", line 362, in __init__ self._handle = _dlopen(self._name, mode) TypeError: LoadLibrary() argument 1 must be string, not unicode「TypeError: LoadLibrary() argument 1 must be string, not unicode」と怒られてる。
Python 2.7.13 で動くように修正してみると…。
def _load_library(name, dll_type="C"): """Try to load a shared library, report an error on failure.""" if name: name = name.encode('ascii', 'ignore') # add if dll_type == "Win": return ctypes.WinDLL(name) else: return ctypes.CDLL(name)1行追加しただけで、Python 2.7.13 でも動くようになった。
しかし、同じ修正をしたものを Python 3.5.4 で動かしてみると。
> py -3 Earth.py Traceback (most recent call last): File "Earth.py", line 11, in <module> import pi3d (中略) File "C:\Python\Python35\lib\site-packages\pi3d\constants\__init__.py", line 72, in _load_library return ctypes.WinDLL(name) File "C:\Python\Python35\lib\ctypes\__init__.py", line 351, in __init__ self._handle = _dlopen(self._name, mode) TypeError: LoadLibrary() argument 1 must be str, not bytes今度は、「TypeError: LoadLibrary() argument 1 must be str, not bytes」と怒られた。
Python 2.7.13 と Python 3.5.4 で、エラーメッセージが違ってる…。LoadLibrary() に与えるべき文字列の種類が違うという。
TypeError: LoadLibrary() argument 1 must be string, not unicode TypeError: LoadLibrary() argument 1 must be str, not bytes
解決策としては…。英語圏のやり取りを眺めると「Python 2.7.12 にダウングレードしろ」「もしくは Python 3.x を使え」ということになってるっぽいな…。
Python 2.7.13 は _結構色々修正されてる っぽいから、できれば 2.7.13 のほうがいいのではと思えてくるけど、しかし、こういう不具合があるのでは…。ていうか去年の年末に報告されてたのに、修正版はまだ出ないのか…。
[ ツッコむ ]
#2 [python] Python 2.7.13 から 2.7.12 にダウングレードした
Windows10 x64上で普段使ってる Python を、2.7.13 から 2.7.12 にダウングレードすることにした。2.7.13 のバグがちょっとアレなので。
上書きインストールしたらダウングレードできるかな、と期待したけど甘かった。相変わらず 2.7.13 のまま。仕方ないのでアンインストールしてから再インストールすることに。面倒臭いことになってきた。
上書きインストールしたらダウングレードできるかな、と期待したけど甘かった。相変わらず 2.7.13 のまま。仕方ないのでアンインストールしてから再インストールすることに。面倒臭いことになってきた。
◎ モジュール一覧を残しておく。 :
アンインストールする前に、インストール済みのモジュールの一覧を残しておく。
本来であれば、
pip freeze > list.txt
本来であれば、
pip -r list.txtで、全部まとめて一括して再インストールできるらしいけど。おそらく pip でインストールできないモジュールもありそうだから、一つ一つ確認しながら再インストールすることに。
◎ コントロールパネルからアンインストール。 :
コントロールパネルから、Python 2.7.x 関係と Python 3.5.x 関係をアンインストール。自分の環境では以下が見つかった。
アンインストール後も、Pythonインストールフォルダに色々残ってるので、フォルダをリネームして一応バックアップを取っておく。後で要らなくなったら削除する。
Python 2.7.12 Python 2.7.13 Python 3.5.4 PyGTK 2.24.2 PyQt GPL 4.11.4 pywin32 219 pyreadline 2.0 wxPython 3.0.2.0 wxPython docs and demos 3.0.2.0
アンインストール後も、Pythonインストールフォルダに色々残ってるので、フォルダをリネームして一応バックアップを取っておく。後で要らなくなったら削除する。
◎ 再インストール。 :
Python 2.7.12、Python 3.5.4 の順番でインストール。普段は Python 2.7.x を使ってるので、Python 2.7.12 のインストール時に、PATHへ追加するあたりのオプションを有効にした。
python --version py -2 --version py -3 --version pip --version再インストールできたっぽい。pip は「アップデートしろ」と言ってきたので、メッセージに従ってアップデート。
◎ 各モジュールのインストール。 :
項目が多いので別記事としてメモ。
◎ pi3dについて。 :
Python 2.7.13 から 2.7.12 にしたら、pi3d_demos のスクリプトもちゃんと動作しました。つまり、動かなかったのは Python 2.7.13 のバグのせいだった、ということで。
[ ツッコむ ]
#3 [python] Python 2.7.12 ダウングレード時に再インストールしたモジュールについてメモ
大半のモジュールは pip install hoge でインストールできたけど、一部のモジュールは別作業でインストールしないといけなかった、ので一応メモ。
◎ pipでインストールできるようになったもの。 :
pyreadline , wxpython は pip でインストールできるようになったらしい。
◎ PyGTK等。 :
PyGTK-all-in-one は、
_Index of /pub/gnome/binaries/win32/pygtk/2.24
から、pygtk-all-in-one-2.24.2.win32-py2.7.msi をDLしてインストール。これで、pygtk , pycairo , pygobject がインストールされた。
◎ pywin32。 :
pywin32 は、pip でインストールできないらしい。
_Python for Windows Extensions - Browse /pywin32 at SourceForge.net
から、pywin32-221.win32-py2.7.exe をDLしてインストール。
◎ py2exe。 :
py2exe は、pip でインストールしようとすると「お前の使ってるPythonバージョン用のバイナリはねえ」と怒られる。が、Python 2.7用のpy2exe は py2exe_py2 という名前で提供されてるっぽい?
pip install py2exe_py2が、 _py2exe - Browse /py2exe at SourceForge.net から入手したほうがいいような気がする。py2exe-0.6.9.win32-py2.7.exe をDLしてインストール。
◎ Pymacs。 :
Pymacs も、pip からインストールできない。
_Pymacs install for windows - ブログ for programming
を参考にさせてもらってインストールした。
◎ PyOpenGL。 :
PyOpenGL は、pip でインストールするとデモスクリプトが動かなかったりしてハマる。
_Python Extension Packages for Windows - Christoph Gohlke から、
デモスクリプトは、 _PyOpenGL-Demo 3.0.1b1 : Python Package Index から、PyOpenGL-Demo-3.0.1b1.zip をDLして解凍。フォルダの中に入って、
_Python Extension Packages for Windows - Christoph Gohlke から、
PyOpenGL-3.1.1-cp27-cp27m-win32.whl PyOpenGL_accelerate-3.1.1-cp27-cp27m-win32.whlをDLして、それらを使ってインストールする。
pip install PyOpenGL-3.1.1-cp27-cp27m-win32.whl pip install PyOpenGL_accelerate-3.1.1-cp27-cp27m-win32.whl
デモスクリプトは、 _PyOpenGL-Demo 3.0.1b1 : Python Package Index から、PyOpenGL-Demo-3.0.1b1.zip をDLして解凍。フォルダの中に入って、
python setup.py installを実行すると、以下の場所にインストールされる。
Python2.7インストールフォルダ\Lib\site-packages\PyOpenGL-Demo\
◎ wxPythonのデモスクリプト等。 :
wxPython のデモスクリプトとドキュメントは、
_wxPython Downloads
経由で、
_Index of /wxPython4/extras/4.0.0b1
から入手可能。
デモは、demo.py を実行すると見れる。
ドキュメントは、index.html を開けば見れる、けど、Web上の _wxPython API Documentation を眺めたほうが早いかも。
wxPython-demo-4.0.0b1.tar.gz wxPython-docs-4.0.0b1.tar.gzそれぞれをDLして任意のフォルダに解凍。ただ、かなり解凍時間がかかる。両方合わせて9,000ファイルぐらいあるようで。
デモは、demo.py を実行すると見れる。
ドキュメントは、index.html を開けば見れる、けど、Web上の _wxPython API Documentation を眺めたほうが早いかも。
[ ツッコむ ]
以上、1 日分です。