HorusのPython2.xから3.xへの移植
基本方針
Python2.7系の最新安定板と最新のライブラリ群で動作するところまで持っていったら2to3でPython3.x系向けのコードに変換する
Horus0.2rc1(Windows版)同梱ライブラリのバージョン
python 2.7.2(32bit)
wxpython 2.8.12.0
opencv-python 2.4.9
pyopengl 3.0.1
pyserial 2.7
numpy 1.8.1
scipy 0.14.0
matplotlib 1.4.3
※ バージョンの確認には version を使用
出典:note.nkmk.me 「Pythonのパッケージ(ライブラリ)のバージョンを確認」
python 2.7.16(on Windows10 64bit)で同名のライブラリを揃えた場合(20190420時点)
python 2.7.16
wxPython 4.0.4
opencv-python 4.1.0.25
PyOpenGL 3.1.0
pyserial 3.4
numpy 1.16.2
scipy 1.2.1
matplotlib 2.2.4
以下は外部のPythonで環境を構築しhorus.pyを起動しようとして失敗した際のログ
set PATH=C:\Python27\Scripts;%PATH%
C:\Python27\python.exe -m pip install --upgrade pip
C:\Python27\python.exe -m pip install wxpython opencv-python pyopengl pyserial numpy scipy matplotlib
cd “C:\Program Files (x86)\Horus”
C:\Python27\python.exe “C:\Program Files (x86)\Horus\horus.py”
Traceback (most recent call last):
File “C:\Program Files (x86)\Horus\horus.py”, line 42, in
main()
File “C:\Program Files (x86)\Horus\horus.py”, line 38, in main
from horus.gui import app
File “C:\Program Files (x86)\Horus\src\horus\gui\app.py”, line 12, in
from horus.gui.main import MainWindow
File “C:\Program Files (x86)\Horus\src\horus\gui\main.py”, line 28, in
from horus.gui.workbench.scanning.main import ScanningWorkbench
File “C:\Program Files (x86)\Horus\src\horus\gui\workbench\scanning\main.py”, line 18, in
from horus.gui.workbench.scanning.view_page import ViewPage
File “C:\Program Files (x86)\Horus\src\horus\gui\workbench\scanning\view_page.py”, line 15, in
from horus.gui.util.scene_view import SceneView
File “C:\Program Files (x86)\Horus\src\horus\gui\util\scene_view.py”, line 22, in
from horus.gui.util import opengl_helpers, opengl_gui
File “C:\Program Files (x86)\Horus\src\horus\gui\util\opengl_helpers.py”, line 27, in
glutInit() # Hack; required before glut can be called. Not required for all OS.
File “C:\Python27\lib\site-packages\OpenGL\GLUT\special.py”, line 333, in glutInit
_base_glutInit( ctypes.byref(count), holder )
File “C:\Python27\lib\site-packages\OpenGL\platform\baseplatform.py”, line 407, in call
self.name, self.name,
OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling
※ python launcherがインストールされているなら"C:\Python27\python.exe"は"py -2-32"などと入力すれば良い
〇 py -2.7-32
× py -2-32
……初歩的なミスだよワトソン君
※ pipでインストール出来るhorusはgeneric user registration for the Pyramid web frameworkとあるので、別物
"glutInit() # Hack; required before glut can be called. Not required for all OS."←これが悪さしてるっぽい
↓
OpenGLのGlutのエラーについてはHorusからglut32.dllを持ってくることで解決
関連:ousttrue氏のQiita上のポスト「PyOpenGLしてみる」
pipでインストールしたものはLib\site-packages配下に存在
C:\Python27\Lib\site-packages\OpenGL\DLLSが空っぽ
C:\Program Files (x86)\Horus\python\Lib\OpenGL\DLLSの中身を上記フォルダ内にコピペ
※ 64bit版Pythonならglut64.dllもどっかから持ってくる必要がありそう
Glutのエラーが消えてよっしゃ!……と思ったら今度はwxpythonのエラー
py -2.7-32 horus.py
Traceback (most recent call last):
File “horus.py”, line 42, in
main()
File “horus.py”, line 38, in main
from horus.gui import app
File “src\horus\gui\app.py”, line 13, in
from horus.gui.splash import SplashScreen
File “src\horus\gui\splash.py”, line 15, in
class SplashScreen(wx.SplashScreen):
AttributeError: ‘module’ object has no attribute ‘SplashScreen’
……GUI、tkで書き直したろかい、ちくせう
※ PowerShellで動かす方がコマンドプロンプトで動かすよりエラーログ見やすいかも
恐らくwxpythonのある程度古い版を入れる必要がありそうってことでpipでwxpythonのダウングレードを試みる
py -2.7-32 -m pip uninstall wxpython
py -2.7-32 -m pip install wxpython==2.8.12.0
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won’t be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting wxpython==2.8.12.0
Could not find a version that satisfies the requirement wxpython==2.8.12.0 (from versions: 4.0.0a1, 4.0.0a2, 4.0.0a3, 4.0.0b1, 4.0.0b2, 4.0.0, 4.0.1, 4.0.2, 4.0.3, 4.0.4)
No matching distribution found for wxpython==2.8.12.0
4.0.0a1より前に遡れないとか何とか。
※ どうやらwxPythonは3.x系列までと4.x系列からとで大きく仕様が変化しているっぽい?
出典:Yusuke Miura氏のblog「穀風」内の記事「wxPython は Phoenix という新しいバージョンがあるので注意」
→sourceforgeからwxPython2.8-win32-unicode-2.8.12.0-py27.exeをダウンロード&インストール
py -2.7-32 horus.py
Traceback (most recent call last):
File “horus.py”, line 42, in
main()
File “horus.py”, line 38, in main
from horus.gui import app
File “src\horus\gui\app.py”, line 12, in
from horus.gui.main import MainWindow
File “src\horus\gui\main.py”, line 27, in
from horus.gui.workbench.calibration.main import CalibrationWorkbench
File “src\horus\gui\workbench\calibration\main.py”, line 17, in
from horus.gui.workbench.calibration.pages.camera_intrinsics import CameraIntrinsicsPages
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 19, in
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
File “C:\Python27\lib\site-packages\matplotlib\backends\backend_wxagg.py”, line 10, in
from . import wx_compat as wxc
File “C:\Python27\lib\site-packages\matplotlib\backends\wx_compat.py”, line 32, in
raise ImportError(missingwx)
ImportError: Matplotlib backend_wx and backend_wxagg require wxPython>=2.9
backend_wx と backend_wxagg は wxPython>=2.9 でないと動かないとか何とか。
→コントロールパネルから先ほどインストールしたwxPython2.8-win32-unicode-2.8.12.0-py27.exeをアンインストール
→sourceforgeからwxPython2.9-win32-2.9.5.0-py27.exeをダウンロード&インストール
スプラッシュスクリーン表示までは辿り着く。しかし……
py -2.7-32 horus.py
2019-04-20 22:52:50.234 - Start application Horus 0.2rc1
Traceback (most recent call last):
File “C:\Python27\lib\site-packages\wx-2.9.5-msw\wx_core.py”, line 16767, in
lambda event: event.callable(*event.args, **event.kw) )
File “src\horus\gui\splash.py”, line 27, in do_callback
self.callback()
File “src\horus\gui\app.py”, line 47, in after_splash_callback
self.main_window = MainWindow()
File “src\horus\gui\main.py”, line 54, in init
self.load_workbenches()
File “src\horus\gui\main.py”, line 73, in load_workbenches
self.workbench[‘calibration’] = CalibrationWorkbench(self)
File “src\horus\gui\workbench\calibration\main.py”, line 26, in init
Workbench.init(self, parent, name=_(‘Calibration workbench’))
File “src\horus\gui\workbench\workbench.py”, line 45, in init
self.add_pages()
File “src\horus\gui\workbench\calibration\main.py”, line 45, in add_pages
self, start_callback=self.disable_panels, exit_callback=self.update_panels))
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 35, in init
self.result_page = ResultPage(self, exit_callback=self.on_exit)
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 105, in init
self.plot_panel = CameraIntrinsics3DPlot(self.panel)
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 153, in init
self.initialize()
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 160, in initialize
self.ax = self.fig.gca(projection=‘3d’, axisbg=(0.7490196, 0.7490196, 0.7490196, 1))
File “C:\Python27\lib\site-packages\matplotlib\figure.py”, line 1844, in gca
return self.add_subplot(1, 1, 1, **kwargs)
File “C:\Python27\lib\site-packages\matplotlib\figure.py”, line 1257, in add_subplot
a = subplot_class_factory(projection_class)(self, *args, **kwargs)
File “C:\Python27\lib\site-packages\matplotlib\axes_subplots.py”, line 77, in init
self._axes_class.init(self, fig, self.figbox, **kwargs)
File “C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py”, line 104, in init
*args, **kwargs)
File “C:\Python27\lib\site-packages\matplotlib\axes_base.py”, line 541, in init
self.update(kwargs)
File “C:\Python27\lib\site-packages\matplotlib\artist.py”, line 888, in update
for k, v in props.items()]
File “C:\Python27\lib\site-packages\matplotlib\artist.py”, line 881, in _update_property
raise AttributeError(‘Unknown property %s’ % k)
AttributeError: Unknown property axisbg
matplotlibの2.0以降ではaxisbgが廃止されたのでfacecolorを使う必要があるとかなんとか。
出典:stackoverflowの"AttributeError: Unknown property axisbg"
File “src\horus\gui\workbench\calibration\pages\camera_intrinsics.py”, line 160, in initialize
self.ax = self.fig.gca(projection=‘3d’, axisbg=(0.7490196, 0.7490196, 0.7490196, 1))
File “src\horus\gui\workbench\calibration\pages\laser_triangulation.py”, line 185, in initialize
self.ax = fig.gca(projection=‘3d’, axisbg=(0.7490196, 0.7490196, 0.7490196, 1))
File “src\horus\gui\workbench\calibration\pages\platform_extrinsics.py”, line 182, in initialize
self.ax = fig.gca(projection=‘3d’, axisbg=(0.7490196, 0.7490196, 0.7490196, 1))
上記3つのファイルの"axisbg"を"facecolor"に書き換えることでHorusの起動までは辿り着く。しかしカメラやCiclopの制御基板にアクセス出来ない。
[ WARN:0] terminating async callback
2019-04-21 12:15:32.401 - Connecting camera 0
2019-04-21 12:15:33.563 - Disconnecting camera 0
OpenCVのダウングレードでArduino Uno及びHD Webcam C270への接続に成功
py -2.7-32 horus.py
2019-04-22 10:22:17.187 - Start application Horus 0.2rc1
2019-04-22 10:23:18.035 - Connecting camera 0
2019-04-22 10:23:19.335 - Done
2019-04-22 10:23:19.336 - Connecting board COM4 115200
2019-04-22 10:23:20.986 - Done
インストール済みのOpenCVの削除
py -2.7-32 -m pip uninstall opencv-python
OpenCVの公式GitHubからopencv-2.4.13.6-vc14.exeをダウンロード&実行
展開して現れたopencv\build\python\2.7\x86\cv2.pydをC:\Python27\Lib\site-packagesに貼り付け
出典:konta220氏のQiita上のポスト「OpenCV 2.4.11をPython2.7で使う (Windows)」
後は
・ライブラリの更新に伴う細かい動作不良の洗い出しと修正
・OpenCV の 2.4.13.6 から 4.1.0.25 への更新(opencv-contrib-pythonも必要?)
・wxPython の 2.9.5.0 から 4.0.4 への更新
・Python2.xからPython3.xへ、コードの変換
依然として先は長い模様。
総括
連鎖するエラーでもぐら叩き状態。まぢでcursesとかTkinterでUIを書き直す方が早いかも。自分の知識や力量では短期間で修正出来そうにないので、12月末に間に合わせることを目標にぼちぼちPython3.x系への移植に挑んでみます。余裕があればPyOpenCL(Open Computing LanguageのAPIにPythonからアクセスするやつ)等の利用で計算の軽量化・高速化が行えないか試したいところ。