MacとAnacondaを利用したPython Spyder環境構築

Windows、MacともずっとPython2.Xの環境を利用していたが、Anacondaを利用して、3.Xも利用できるようにした。ただ、Macでは、IDEのSpyderが最新でのAnacondaではうまく動作しなかったので、その対策メモ(対策が正しいかどうかは保証なし)。

【環境】
●Mac: OS X El Capitan
●pyenv: 1.0.2
●Anaconda: miniconda-latest
●Python: 2.7.12, 3.5.2

【インストール方法】
$ conda create -n py35 python=3.5
$ pip install spyder
 qt pyqtはpipではインストールできなかったので、condaを利用
$ conda install qt pyqt
 インストールされたバージョン
- pyqt 5.6.0 py35_0
- qt 5.6.0 0
- sip 4.18 py35_0
- spyder 3.0.0

上記の動作する組み合わせがわかれば、condaの-fフラグで強制的にバージョン指定しても良いかも(未確認)。

【参考:問題が発生した方法】
$ conda create -n py35 python=3.5
$ conda install spyder
下記のエラーが発生。pyqtやsipをcondaでupdateしようしても、バージョンが整合していないみたいで、うまく動作せず。
untimeError: the sip module implements API v11.0 to v11.2 but the PyQt4.QtCore module requires API v11.3

インストールされているバージョン
- SIP::4.16.9
- pyqt:4.11.4
- spyder:2.3.9

下記のようにanaconda3-4.1.1をインストールしたり、仮装環境にもそのまま指定すると動作するみたいだが、

$ conda create -n py27 python=2.7 anaconda

不要なモジュールがいっぱいコピーされるので、とりあえず、前述の方法で対応中。

猫を抱いて象と泳ぐ

夏休みに旅行にでかけるお供に、小川洋子氏の「猫を抱いて象と泳ぐ」を読む。なんとも不思議な8×8のチェスの世界。64通りと限りある升がこんなにも深い世界を彩どるなんて、こんな文章を書ける人がいるなんて、この世は不思議なことがまだまだいっぱい。



夢をかなえるゾウ3

久しぶりに、専門書以外の書籍「夢をかなえるゾウ3」を読んだので、駄文を!

「夢をかなえるゾウ」の最初の本は随分前に読んだが、この本も最初の本に増して、色々考えさせることがあった。
笑いの中に、訓えをうまく混ぜ、更に主人公の女性の恋愛も絡めることで、絶妙のバランスと味わいのある文章で、一気に最後まで読ませてしまう作者の筆力に今回も大いに感動。

「この世界はな、自分がどこまで『知る』かを、自分で決められるようにできてんねん。自分はこの世界をもっと知りたいんか、それともここでやめるんか。それを決めることができるんは、自分だけや」

生きる素晴らしさ、生きる価値って、結局どう生きるかを自分で決めることができることあるんじゃないかしら。

「山頂に立って、初めてわかんねん。『自分が来るべき道はこれだったんだ』て。『無駄な出来事なんて一つもなかった。この場所に来るために、全部必要なことなんだったんだな』って。

この言葉も今の自分には「その通り」と強く共感できる。今大人気のNHK朝の連ドラ「朝が来た」ではないけど、人生って、七転び八起きなんだろうね。。。


JRubyによるSikuli操作2

JRubyによるSikuli操作1 で作成したサンプルをSelenium WebDriverで提案されているPageObject的に作成し直したサンプル。Specで簡単にテストを追加できるので、結構いい感じ。

●calculator.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true

require 'java'
$CLASSPATH << "/Users/XXX/develop/SikuliX"
require "sikulixapi.jar"

java_import org.sikuli.script.App
java_import org.sikuli.script.Screen
java_import org.sikuli.script.Region
java_import org.sikuli.script.Sikulix
java_import org.sikuli.script.Key
java_import org.sikuli.script.KeyModifier
java_import org.sikuli.basics.Settings

# for Java clipboard
java_import java.awt.Toolkit
java_import java.awt.datatransfer.Clipboard
java_import java.awt.datatransfer.DataFlavor
java_import java.awt.datatransfer.StringSelection

class Calculator
def initialize()
# ready for clipboard
toolkit = Toolkit.getDefaultToolkit()
@clipboard = toolkit.getSystemClipboard()

Settings.MoveMouseDelay = 0 # 0[sec]

@app = App.open("calculator")
@app.focus()
@scn = Screen.new
@scn.wait("calculator.png", 5)
end

def finalize
App.close("calculator")
end

def copy(contents)
@clipboard.setContents(StringSelection.new(contents), nil)
end

def paste()
#`pbpaste` # just for Mac
contents = @clipboard.getContents(nil)
contents.getTransferData(DataFlavor.stringFlavor)
end

def copy()
@scn.type('c', KeyModifier::CMD)
end

def get_result()
copy()
paste()
end

def click(key)
@scn.click(key+'.png')
end

def clear()
if @scn.exists("C.png")
click("C")
else
click("AC")
end
end
end


●calc_spec.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true
require "rspec"
include RSpec::Expectations

require_relative 'calculator' # テストターゲット

describe "計算機" do
before(:all) do
@calc = Calculator.new
end

after(:all) do
@calc.finalize
end

it "test 1 + 2 = 3" do
@calc.clear()
@calc.click("1")
@calc.click("+")
@calc.click("2")
@calc.click("=")
expect(@calc.get_result()).to eq "3"
end

it "test 2 - 3 = -1" do
@calc.clear()
@calc.click("2")
@calc.click("-")
@calc.click("3")
@calc.click("=")
expect(@calc.get_result()).to eq "-1"
end

it "test 2 x 3 = 6" do
@calc.clear()
@calc.click("2")
@calc.click("x")
@calc.click("3")
@calc.click("=")
expect(@calc.get_result()).to eq "6"
end

it "test 1 / 2 = 0.5" do
@calc.clear()
@calc.click("1")
@calc.click("d") # d.png -> /
@calc.click("2")
@calc.click("=")
expect(@calc.get_result()).to eq "0.5"
end

it "test 1 / 0 = 数値ではありません" do
@calc.clear()
@calc.click("1")
@calc.click("d") # d.png -> /
@calc.click("0")
@calc.click("=")
expect(@calc.get_result()).to eq "数値ではありません"
end
end
                    
                  

JRubyによるSikuli操作1

JRuby/RSpecからSikuliを使ったテストプログラムのサンプル。計算機の結果はJavaのクリップボードを使って取得する様にしてみた。JRubyからSikuliとJavaの両方が使える様になったので、とっても便利。

●環境
・MAC:OS X El Capitan
・Sikuli-1.1.0
・JRuby:jruby-9.0.0.0.pre1

●参考にさせていただいたURL
画像認識でアプリケーション操作の自動化を実現!Sikuliがあまりに革命的で興奮した
How-To: Sikuli and Robot Framework Integration
masuoのブログ:Sikuliに関する日本語情報がいっぱい

●calc_spec.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true
require "rspec"
include RSpec::Expectations

require 'java'
$CLASSPATH << "/Users/XXX/develop/SikuliX"
require "sikulixapi.jar"

java_import org.sikuli.script.App
java_import org.sikuli.script.Screen
java_import org.sikuli.script.Region
java_import org.sikuli.script.Sikulix
java_import org.sikuli.script.Key
java_import org.sikuli.script.KeyModifier
java_import org.sikuli.basics.Settings

# for clipboard
java_import java.awt.Toolkit
java_import java.awt.datatransfer.Clipboard
java_import java.awt.datatransfer.DataFlavor
java_import java.awt.datatransfer.StringSelection

describe "計算機" do
def copy(contents)
@clipboard.setContents(StringSelection.new(contents), nil)
end

def paste()
#`pbpaste` # just for Mac
contents = @clipboard.getContents(nil)
contents.getTransferData(DataFlavor.stringFlavor)
end

before(:all) do
@app = App.open("calculator")
@app.focus()
@scn = Screen.new

Settings.MoveMouseDelay = 0 # 0.0[sec]

# ready for clipboard
toolkit = Toolkit.getDefaultToolkit()
@clipboard = toolkit.getSystemClipboard()
end

after(:all) do
App.close("calculator")
end

it "test 1 + 2 = 3" do
@scn.wait("calculator.png", 5)
if @scn.exists("C.png")
@scn.click("C.png")
else
@scn.click("AC.png")
end
@scn.click("1.png")
@scn.click("+.png")
@scn.click("2.png")
@scn.click("=.png")
@scn.type('c', KeyModifier::CMD)
expect(paste()).to eq "3"
end

it "test 2 x 3 = 6" do
if @scn.exists("C.png")
@scn.click("C.png")
else
@scn.click("AC.png")
end
@scn.click("2.png")
@scn.click("x.png")
@scn.click("3.png")
@scn.click("=.png")
@scn.type('c', KeyModifier::CMD)
expect(paste()).to eq "6"
end
end
プロフィール

Author:Zaike Yuki
オブジェクト指向、C++/Java、Python、Eclipse、Android、等に興味を持つソフトウェアエンジニア

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる