Select sjis if the characters are not shown properly. Internet Expolorer is the targetted browser.

@(#) xyzzypython.txt

$Filename: xyzzypython.txt $
$Lastupdate: 2018-10-17 17:00:22 $

Windows 10 で使用しているエディター xyzzy で、python3 のコードを編集したり、実行する環境の整備の方法を紹介します。

便利なキーバインド
キーバインド 機能
C-c k p c @begin(code}{proglist} ... @end{code} の範囲を実行
C-c k w r 元のウィンドウ配置に戻る

[TopHdngList] [BodyStart] [Top] [End]

CONTENTS   CONTENTS が閉じられているときでも [Contents] ボタンは有効です。
CONTENTS が閉じられているときに、アウトライン見出しのところに表示 されている [Contents] ボタンをクリックすると、 CONTENTS を表示して、 そのアウトライン見出しに対応している CONTENTS の中の見出しにジャンプします。
この後、CONTENTS は表示されたままになります。
CONTENTS 内の各行の最後に示されている数字は、 そのアウトライン見出し行が文書ファイルの何行目にあるかを表しています。

[ContentsTop]
TOP HDNG LIST ALL HEADING LIST NOTE LIST

[Close TOP HEADING LIST]

ALL HEADING LIST ■はアウトライン見出しのタイトル □はそれ以外
27*1 ■py-mode.l のインストール
85*2 ■xyzzy lisp の追加コード
250*3 ■python のスクリプト・ファイルの xyzzy での編集と実行
352*4 ■バッファの中の code 環境の実行
411*5 ■py-shell の起動

[Close ALL HEADING LIST]

NOTE LIST
Note の一覧: Note はありません。

[Close NOTE LIST]

[Top] [End] [ContentsTop]

[CTop] [Contents][TopHdngList][][Next][SameLvlPrev][Child][SameLvlNext][Parent][Top][End]

1 py-mode.l のインストール

エディター xyzzy で、python のコードを編集したり、python のコードを含む文書を編集するには、py-mode.l をインストールするといいようです。

Google で、「xyzzy py-mode」で検索すると、py-mode に関係するページがたくさん表示されます。

  1. 「xyzzy py-mode mode - Github-Gist」
    https://gist.github.com/hidsh/1928231

  2. :::py-mode--python用メジャーモード
    http://www.geocities.co.jp/Milano-Cat/2067/xyzzy.html#py-mode
最初、a. からダウンロードできる py-mode.l を試してみましたが、cbar は、うまく利用できませんでした。

次に、b. のページにあるリンク download py-mode をクリックして取得した py-mode-20070407.zip を解凍して、含まれていた py-mode.l を試してみました。

結果的には、こちらの py-mode.l の方がうまく行きました。コードを見てみると、同じように見えます。a. のページから取得したファイルの方では、文字コードや行末コードの設定で、うまくいかないようにしてしまったのかも知れません。

ちなみに、b. のページからダウンロードした py-mode.l は、文字コードは、sjis で、行末コードは、crlf でした。

  1. b. のページから取得した py-mode.l を site-lisp フォルダにコピーしました。

  2. py-mode.l をバイトコンパイル byte-complile-file して、.xyzzy に

      (load-library "py-mode")
      (push '("¥¥.py$" . py-mode) *auto-mode-alist*)

    と書きました。

漢字コードの取り扱いについて、この py-mode.l には、

文字コードについて

  PYTHONPATH¥Lib¥site-packages¥sitecustomize.py(なければ作る)

  import sys
  from codecs import getwriter
  sys.setdefaultencoding('shift_jis')
  sys.stdout = getwriter('shift_jis')(sys.stdout)

と書くと日本語のエンコード関係がマシになるかもしれません。
と書いてありますが、何もせずに先に進むことにしました。

python は、デフォールトで、UTF-8 を使うことになっているようなので、python のスクリプト・ファイルでは、文字コードを UTF-8 にし、行末コードは、crlf にすることにしました。

当面、この設定で運用することとし、不都合が生じたときに、 sitecustomize.py を作成することを含めて対応策を検討することにします。

 

[CTop] [Contents][TopHdngList][Prev][][Next][SameLvlPrev][Child][SameLvlNext][Parent][Top][End]

2 xyzzy lisp の追加コード

kh-base.l に、つぎのような save-winconf() 関数と revert-winconf() 関数の定義を加えました。

001: (defun save-winconf ()
002:   (interactive)
003:   (setq *winconf* (current-window-configuration))
004:   )
005: 
006: (defun revert-winconf ()
007:   (interactive)
008:   (set-window-configuration *winconf*)
009:   )

save-winconf() は、xyzzy の現在のWindows分割を記憶し、 revert-winconf() は、記憶しておいたWindows分割に戻します。

kh-pytool.l を作成し、site-lisp に置きました。

kh-pytool.l
; -*- Mode: Lisp; Package: USER -*-
#|
== startdoc
;;; @(#) kh-pytool.l
;;;
;;; @(%) $OPT_NOCONTENTS = true
;;; 上の行のオプション指定により、目次を作成しません。* が一
;;; つの見出しのリストは、TOP HDNG LIST の「表示」をクリック
;;; すると表示されます。
;;; (File "template.lnk" "template.l")
;;; (File "progform.sample.lnk" "form.l")
;;; (File "sitelisp.lnk" "my-form.l")
. $Filename: kh-pytool.l $
. $Lastupdate: 2018-08-29 14:10:53 $

------------------------------------------------------------
* 概要

py-mode.l で定義された関数を使って、python 関係のツールを
定義しています。

 (load-library "py-mode")
 (push '("¥¥.py$" . py-mode) *auto-mode-alist*)

の後に、

 (load-library "kh-pytool")

 (global-set-key '(#¥C-c #¥k #¥p #¥c) 'user::my-pyexecute-code)
 (global-set-key '(#¥C-c #¥k #¥p #¥e) 'user::my-pyexecute-buffer)

とかいた行を追加して、利用してください。

------------------------------------------------------------
* require 文

下の proglist を有効にするときは、♯を半角の # にしてください。

@begin{code}{proglist} -------------------------------------
|#
(require "py-mode")
(require "kh-base")
(require "kh-myregion")
#|
@end{code} -------------------------------------------------

------------------------------------------------------------
* my-pyexecute-code

@begin ... @end の間にカーソルを置いて、この関数 
my-pyexecute-code を呼び出すと、その間にあるコードを 
py-mode.l の中で定義されている py-execute-region を使って、
python のコードとして実行します。

py-execute-region を呼び出す前に、(save-winconf) をして、
ウィンドウの分割状態をスペシャル変数 *winconf* に記憶して
います。

my-pyexecute-code を呼び出す前のウィンドウの分割状態に戻す
には、M-x revert-winconf としてください。

@begin{code} -----------------------------------------------
|#

(defun user::my-pyexecute-code ()
  (interactive)
  (let (lc)
    (save-winconf)
    (user::region-set-region)
    ; 前の行で設定したリージョンを次の行で使用するので、
    ; call-interactively が必要です。
    (call-interactively 'editor::py-execute-region)
    )
  )
#|
@end{code} -------------------------------------------------

------------------------------------------------------------
* my-pyexecute-buffer

現在編集中のバッファに含まれている python プログラムを 
py-model.l の中で定義されている py-execute-buffer を使って
実行します。

py-execute-buffer を呼び出す前に、(save-winconf) をして、
ウィンドウの分割状態をスペシャル変数 *winconf* に記憶して
います。

my-pyexecute-buffer を呼び出す前のウィンドウの分割状態に戻
すには、M-x revert-winconf としてください。

@begin{code}{proglist} -------------------------------------
|#

(defun user::my-pyexecute-buffer ()
  (interactive)
  (let (lc)
    (save-winconf)
    (editor::py-execute-buffer)
    )
  )
#|
@end{code} -------------------------------------------------

------------------------------------------------------------
* provide 文

@begin{code}{proglist} -------------------------------------
|#

(provide "kh-pytool")
#|
@end{code} -------------------------------------------------

------------------------------------------------------------
* enddoc

ここに書いたメモは、o2h からも lisp からも無視されます。
|#

.xyzzy に次のようなコードを書き加えました。

001: (load-library "py-mode")
002: (push '("¥¥.py$" . py-mode) *auto-mode-alist*)
003: 
004: (load-library "kh-pytool")
005: 
006: (global-set-key '(#¥C-c #¥k #¥p #¥c) 'user::my-pyexecute-code)
007: (global-set-key '(#¥C-c #¥k #¥p #¥e) 'user::my-pyexecute-buffer)
008: (global-set-key '(#¥C-c #¥k #¥p #¥r) 'editor::py-execute-region)

001行、002行の設定によって、拡張子が .py のファイルを読み込んだときには、自動的に py-mode になります。

拡張子が .py のファイルでなくても、my-pyexecute-code や my-pyexecute-buffer 関数を使用すれば、py-mode の py-execude-region 関数や py-execute-bufer 関数を利用できます。

my-execute-code() 関数や my-pyexecute-buffer() 関数は、中で、 save-winconf() を呼んでいます。python コードを実行して、実行結果が表示されたバッファを操作して、画面が変わったあとで、元の画面構成に戻すには、revert-winconf() を呼び出すために C-c k w r とタイプすればいいことになります。

 

[CTop] [Contents][TopHdngList][Prev][][Next][SameLvlPrev][Child][SameLvlNext][Parent][Top][End]

3 python のスクリプト・ファイルの xyzzy での編集と実行

xyzzy で、python のスクリプト・ファイルを xyzzy で編集することができます。

pyplotsample.py に示すような、拡張子が .py のファイルを xyzzy の中に読み込んだものとします。

pyplotsample.py のコードは次のようです。

pyplotsample.py
001: # -*- coding: utf-8 -*-
002: """
003: == startdoc
004: ;;; @(#) pyplotsample.py
005: ;;; 型紙ファイル
006: ;;; (fdefun "forml" "sitelisp.lnk" "my-form.l")
007: ;;; (File "progform.sample.lnk" "pyform.txt")
008: ;;; バッファの実行 C-c k p e
009: ;;; (py-execute-buffer)
010: ;;; (File "./matplotlib.txt")
011: $math
012: 
013:  $Filename: pyplotsample.py $
014:  $Lastupdate: 2018-08-25 17:48:05 $
015: 
016: このファイルの漢字コードは utf-8 とします。行末コードは、
017: windows タイプ (crlf) とします。
018: 
019: ------------------------------------------------------------
020: * グラフの表示エリア
021: 
022: 「データ分析ツール Jupyter 入門」(掌田津耶乃著)の第7章
023: の p.266 に記載されている「リスト7-7」を参考にしています。
024: 
025: グラフの縦横の描画範囲は、描かれるグラフの図形を元に自動調整
026: されます。が、表示葉にを手動で指定することも可能です。これに
027: は、axis、xlim、ylim という関数を利用します。
028: 
029: axis は、xlim と ylim の両方を指定します。
030: 
031: @begin{code}{proglist} -------------------------------------
032: """
033: 
034: import numpy as np
035: import matplotlib.pyplot as plt
036: 
037: x = np.arange(-2*np.pi, 2*np.pi, 0.1)
038: y0 = np.sin(x)
039: y1 = np.cos(x)
040: 
041: plt.plot(x, y0, label='y = sin(x)')
042: plt.plot(x, y1, label='y = cos(x)')
043: plt.legend()
044: 
045: plt.title('sample graph')
046: plt.xlabel('degree')
047: plt.ylabel('value')
048: 
049: plt.grid(which='both', axis='x', color='#0000ff', alpha=0.25, linestyle='-', linewidth=1)
050: 
051: plt.grid(which='major', axis='y', color='#00ff00', alpha=0.5, linestyle=':', linewidth=2)
052: 
053: plt.xlim([-7, 7])
054: plt.ylim([-1.5, 1.5])
055: # plt.axis(--7, 7, -1.5, 1.5])
056: 
057: plt.show()
058: 
059: print(x)
060: 
061: """
062: @end{code} -------------------------------------------------
063: 
064: == enddoc
065: """

xyzzy で、python のスクリプト・ファイルを読み込み、python のスクリプト・ファイルを編集中のバッファにカーソルを移動すると、 xyzzy のメニュー・バーに、

  Python(P)

という項目が表示されます。この項目をクリックするか、Alt, p をタイプすると、py-mode で定義されたプルダウン・メニューが表示されます。

プルダウン・メニューの中の「バッファを実行」を選択するか、または、pyplotsample.py を編集しているバッファで、 C-c k p e とタイプすると、 57行に書かれている plt.show() によって出力される画像と print(x) によって出力されるデータが表示されます。

表示失敗?: ./xyzzypython.txt--180825175510.png
pyplotsample.py の実行により表示されるグラフ

 

[CTop] [Contents][TopHdngList][Prev][][Next][SameLvlPrev][Child][SameLvlNext][Parent][Top][End]

4 バッファの中の code 環境の実行

python のスクリプトファイルでなくても、バッファの一部につぎのように、@begin{code}{...} ... @end{code} で囲んで書いておき、@begin{code}{...} ... @end{code} に囲まれた範囲の中にカーソルを置いて、 C-c k p c とタイプすると、そこの python コードが実行されます。

@begin{code} -----------------------------------------------
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-np.pi, np.pi, 0.1)
y = np.sin(x)

print(x[:10])
print(y[:10])

plt.plot(x, y)
plt.show()
@end{code} -------------------------------------------------

@begin{code} ... @end{code} のオプション部分に proglist と書いてある場合は、@begin{code} の直後の行と@end{code}の直前の行は、削除したものを python のコードとして採用します。

@begin{code}{proglist} -------------------------------------
"""

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-np.pi, np.pi, 0.1)
y = np.sin(x)

print(x[:10])
print(y[:10])

plt.plot(x, y)
plt.show()

"""
@end{code} -------------------------------------------------

このように、テキストファイルの中にコードを書き、C-c k p c とタイプして、そのコードを実行するようにすれば、複数の python コードを一つのテキスト・ファイルの中に書いて、実行した結果をそのテキストファイルの中に引用したりできます。

表示失敗?: ./xyzzypython.txt--180825190615.png
\(y = sin(x)\)

 

[CTop] [Contents][TopHdngList][Prev][][Next][SameLvlPrev][Child][SameLvlNext][Parent][Top][End]

5 py-shell の起動

xyzzy で、M-x py-shell とすると, shell バッファが作成され、その shell バッファで、

  > python -i

が実行されます。

これは、python.exe を -i オプションをつけて実行していることを意味します。当然、

 

Produced by the use of o2h version 13.03.
[CTop] [Top] [Prev] [Body] [BodyStart] .