xubuntuのPython仮想環境でLibreOfficeを使う(エピローグ)

前回ではPython仮想環境で起動したLibreOfficeではそのマクロのためのAPSOがエラーで使えないという結果だった。

原因はunoモジュールなどのマクロに必須のモジュールがインポートできないことである。ubuntuなどのlinuxではこれらのモジュールはシステムワイドの領域にインストールするパッケージとして用意されていてPython仮想環境に直接インストールすることは困難になっている。

Python仮想環境はシステムワイドなPythonと隔離してPythonが使えることを理想としているように思われるが、ここでは次善の策としてシステムワイド用に用意されているパッケージを臨時的に使えるようにしてPython仮想環境のLibreofficeを起動させる方式をとった。

そのためにはPython仮想環境下でのターミナルエミュレータ

export PYTHONPATH=/usr/lib/python3/dist-packages

とシステムワイドのパッケージへのパスを通してやる。この下でLibreOfficeを起動させる。これでマクロの作成は問題なくできる。

この方式を採ると1つのPython仮想環境をシステムワイドな環境から切り離した理想的なPython仮想環境とLibreOffice のマクロ作成の環境とに切り換えて使うことができる。

xubuntuのPythonマクロにScriptForgeを使う

ScriptForgeはLibreOfficeをプログラム的に操作することを目的としたモジュール作成のためにLibreOfficeから提供される膨大なライブラリー群である。Pythonマクロ作成にはその一部であるクラスCreateScriptServiceを使う。

ScripyForgeはLibreOfficeのインストールと一緒にインストールされるがxubuntuを含むubuntuではシステムワイドなパッケージとして別個にインストールする:

sudo apt install python3-scriptfoge

またこのクラスを継承した各種ドキュメント用、インタフェース用のクラスが用意されてる。これらの説明はここにある。

ここではスプレッドシートCalcをPythonマクロで操作するために必要なそのサブクラスを使う。

このサブクラスで使える様々のメソッドの説明はここにある。

例題は「今開いているシートのセルA!に書かれている数値を読み込み、それに書かれていた数値に1を加えた数値を再度セルA1に書く出す」というものである:

# coding: utf-8
from __future__ import unicode_literals
from scriptforge import CreateScriptService
doc = CreateScriptService("Calc")
def increment_cell(args=None):
    value = doc.GetValue("~.A1")
    print(type(value))
    value += 1
    doc.SetValue("~.A1", value)
g_exportedScripts = (increment_cell, )

GetValue、SetValueが使ったメソッドで、引数の中の~はCalcで今開いているシートを指す。最後の行はこのモジュールでマクロとして登録する関数名をタプルで並べる。ここの例ではincrement_cellがそれである。

ScriptForgeなしでもマクロは書けるが、これを使った方がプログラムはすっきりする。

xubuntuのPython仮想環境でLibreOfficeを使う

LibreOfficeのPythonマクロ環境は前回に述べた。ここではこの環境で便利なsite-packegeを使うことについてのべる。

windowと異なり、linuxではPythonマクロのために特別なPythonインタプリタが用意されてるわけではない。LinuxではLibreOfficeを起動した環境下にあるPythonを使う。従ってそのPythonにインストールされているsite-packegeがそのまま使える。Pythonプログラミングの作法として仮想環境を使うことを以前述べたが、Pythonマクロ環境もこの仮想環境から起動したPythonを使うことが合理的である。

LibreOfficeの起動は仮想環境のターミナルエミュレータから

soffice -n

を入力する。これで新規のdocumentでLibreOfficeが立ち上がる。様々なフラグは

soffice --help

で見れる。

このLibreOfficeのマクロ作成ではプログラミングには仮想Pythonでインストール済のsite-packageが利用できる。

ここまでのシナリオでいけるかなとおもったらPython仮想環境から立ち上げたLibreOfficeではマクロのための統合環境APSOが起動でエラーになる。

xubuntuにPythonマクロ環境をつくる

前回の続きである。LibreOfficeのマクロは様々なプログラミング言語で作れるようになっていて、Pythonもその1つである。

xubuntuでは別な方法もあるようであるが、ここではwin10でも使ったAPSOというツールを使った環境を作る。このツールの登録はLibreOffice.Calcを立ち上げてツール->拡張機能と進むと登録画面が出るので予めダウンロードしておいたAPSOを登録する。オプションでプログラミングで使うテキストエディタを指定する。xubuntuではnanoやplumaなどが使えるようになっているが、nanoはそのままではダメらしい。plumaは/usr/bin/plumaで引数なしでで立ち上がる。

ユーザが作るマクロの保存場所は決まっていてlinuxでは

.config/libreoffice/4/user/Scripts/python/

である。初期状態では必要なディレクトリが存在しないので適宜に作る。

またユーザが作る汎用的なモジュール(例えばメッセージボックス)は

.config/libreoffice/4/user/Scripts/python/pythonpath

に保存する。これらのモジュールはマクロでインポートして使うことができる。

APSOの起動はLibreoffice.Calcの画面のメニュの

ツール->マクロ->Pythonスクリプトの管理

で行う。APSOの初期画面がでるのでそのメニュから作業を始める(注:APSOの最新版はAPSO1.4.4であるが、ここでは安定版のAPSO1.3.2を使う)。

APSOはよく出来ていて開発中のマクロのデバッグ実行やPythonシェルの表示(マクロの中のprint文の出力はこのシェルにでる。これもデバッグに重宝)などの機能を持っている。なおLibreOfficeのPythonのヴァージョンは3.12.3である。

これで準備は完了。

xubuntuにPython仮想環境をつくる

娘が「遅い」といって手放したlenovoに軽いOSを入れてみた。このlenovoは確かに遅くwin10では精神衛生上よくない遅さである。CPUやメモリーが貧弱な割にハードディスクは容量が1000GBと豊富であるので、軽快に動くと定評のあるxubuntuをwin10とdual bootでインストールする。

xubuntu自体のインストールは問題なく進行したがその手前でPCのBIOSの画面を出すことに苦労した。最も確実な方法はNOVOボタンを使う方法であるらしいが肝心のそのボタンの場所が見つからなかった。このPCでは向かって左の側面のSDカードの挿入口の横に小さな穴がありそれがNOVOボタンでPCの電源を落とした状態でこのボタンを楊枝などで押すとBIOSの画面が立ち上がる。

【Python環境】

xubuntuのインストールでシステムワイドのPython(3.12.4)がインストールされるがPythonプログラミングは仮想環境で行うことが作法である。これはプログラミングが実験的な操作を伴うことが多くシステムワイドなPythonをいじりたくないからである。

そこでhome直下に作業ディレクトリを作りそこをPythonプログラミングの作業領域とする。ターミナルエミュレーターでそこに入って

python3 -m venv MyEnv

と入力。MyEnv(名前は任意)というディレクトリができ必要なファイルがインストールされる。

仮想環境の活性化は以下のコマンドによる:

source MyEnv/bin/activate

これでエミュレーターのプロンプトの先頭に(MyEnv)が付き仮想環境にいることがわかる。ここのPythonは初期状態ではパッケージは何もインストールされていない。プログラミングに必要なパッケージをインストールする。因みに不活性にするには仮想環境内でi以下のコマンドを入力:

deactivate

次に総合開発環境を使えるようにする。以前かからPythonに付属して配布されている総合開発環境idleを愛用しているので仮想環境でもこれを使う。xubuntuで配布しているidleはシステムワイドなPython用でそのままでは仮想環境では使えない。そこで仮想環境下で以下のコマンドを使う:

python3 -m idlelib.idle

これで仮想環境にリンクしたidleが立ち上がる。

 

以上でPythonプログラミングの環境ができた。

pythonプログラムのexe化

Pythonで作ったMakeCaptionWithLogo.pyをPythonに不案内なユーザにも使えるようにexe化することにした。

  • exe化にはpyinstallerを使った。pyinstallerをインストール後にコマンドプロンプトで以下のようなコマンドを入力する:
@echo off 
pyinstaller --onefile --exclude-module numpy \
 --exclude-module ..... --exclude-module ..... \
--exclude-module ..... --exclude-module .....  \
 --noconsole --icon=TOMATO.ico MakeCaptionWithLogo.py

ここで–exclude-moduleオプションはexe化で排除しても無害なモジュールを書く。numpyは大きなモジュールでプログラムでnumpyを使っていないときには積極的に排除する。その他のオプションの説明はここにある。

これでdistフォルダにMakeCaptionWithLogo.exeができる。これがこのファイル1つで配布可能なexeファイルである。サイズは約10MB。排除オプションを外すとサイズは約30MB。排除オプションは有効であることがわかる。

  • この手の配布用のexeファイルを作成するときには仮想環境を使うのが普通らしい。そこでPythonの仮想環境で使う開発環境で述べた仕方で仮想環境を作りこの環境下でexe化を行った。インストールしたモジュールはプログラムに必要なものだけした。できるexeファイルのサイズは10MBを切るだろうと期待したが、この仮想環境下でできたexeファイルのサイズは期待に反して約15MBであった。

 

 

Pythonの仮想環境で使う開発環境

ごつい表題であるが、いつも使っているPythonのプログラミング開発環境を仮想環境でもそのまま使いたということである。

  • Python3.10.4がインストールされているwindows10にそれと同じヴァージョンのPythonの仮想環境を作る:

win10のコマンド・プロンプト(CMD)の窓で

python -m venv [環境を作成したいパス]

ここの[環境を作成したいパス]はユーザ領域で構わない。このpathの中にあるScriptsフォルダにあるactivate.batというバッチファイルをCMDの中で実行すると仮想環境が実現する。詳しくはここを参照。

  • いつもはPythonパッケージに付随して配布されているIDLEをプログラミング開発環境として使っている。この環境を仮想環境の下でも使う。インストールされたそのままではリンクが全て実環境を向いているので、それらのリンクを全て(と言っても2つ)を仮想環境に向ける。

そのために実環境を向いたIDELと別に仮想環境を向いたIDELを作る。まずインストールしたIDELのショートカットを新規につくりそれが仮想環境を向いていることを示す任意の名前する。そのプロパティを開き[リンク先]のpath2つを変更する。
変更前

"C:\.....\Python310\pythonw.exe" \ 
"C:\.....\Python310\Lib\idlelib\idle.pyw"

変更後

"C:.....\PythonEnv\MyEnv\Scripts\pythonw.exe" \
"C:.....\PythonEnv\MyEnv\Scripts\sample.pyw"

ここでsample.pywは以下を中身とするファイルでフォルダScriptsに保存したものでありIDLEが起動される時に実行される:

from idlelib.pyshell import main
main()

詳しくはここを参照のこと。

このIDELを使うことによって実環境の時とほぼ完全に同じ開発環境で仮想環境下でのPythonプログラミングができる。

iphoneでPythonプログラミング(続)

前の投稿でiphoneでPythonプログラミングの基本的な環境を作る話をした。

ところでpc(win10)を使って多くのPythonプログラムを作ってきた。これらがiphoneのPythonで正常に動くか確かめたい。

まずpcにあるプログラムをiphoneに転送する。これには様々な方法があるが今回使ったものはFTPManagerである。win10ではSSHサーヴァを簡単に起動できるのでiphoneではSSHクライアントを起動してsFTPプロトコールによるファイル転送を使う。

FTPManagerをインストールして起動する。「+」アイコンで新規接続を設定する。

サーヴァーのipアドレス
サーヴァーの利用者名
そのパスワード
利用者のホームディレクトリのパス名
これで接続をするとpcのホームディレクトリ下のホルダー・ファイルの一覧が現れる。
それらのホルダーやファイルにはFTPManagerd独自のタグ(3つの点)が付いているので転送したいもののタグをタップするとメニューが出てくる。「にコピー」を選択し、iphone内でFTPManagerが用意した「私のファイル」などを選択「保存」をタップすると転送が始まる。
転送が終わり「私のファイル」をタップすると転送したホルダーやファイルを確認できる。「私のファイル」は他のアプリからは見えないのでホルダーやファイルを移動する。今の目的からa-Shellアプリのディレクトリpythonに移動する。
これにはiphoneの選択・コピー機能を使う。「私のファイル」内にある転送したいファイルをiphoneの選択機能(丸ボタンのタグ)を使い、画面の右下にあるメニューを開き「共有」のタップ、新な画面で「”ファイル”へコピー」の選択。ファイルアプリの画面でコピー先、今の目的ではa-Shellエントリーのpythonホルダーを
選択、保存する。
a-Shellの画面でこのホルダーやファイルがあることを確認する。
Pythonプログラムファイルの実行は以下のよう:
$python ******.py
で実行する。
因みに以下のようなプログラムを実行してみた:

#coding: utf-8
class Garden:
  def __init__(self, plants):
    self.plants = plants
  def __str__(self):
    t = [ object.__str__(self) + '咲いている草花は' ]
    for obj in self.plants:
      s = ' ' + object.__str__(obj)
      t.append(s)
    return '\n'.join(t)

mygarden=Garden(['なずな','はこべら','ほどけのざ'])
print(mygarden)

正常な結果が得られることを確認した。

iphoneでPythonプログラミング

久しぶりのPythonの話題である。

古いiphoneが手元にあったので、これを使ってPythonプログラミングができないか調べてみた。

いろいろなやり方があるが、iOSが持っているPythonを使うのが簡単。そのためにターミナルアプリをインストールした。使ったアプリはa-Shell

a-Shellを起動するとshellの画面が現れる。

$cd
$pwd

を入力するとホームディレクトリが~/Documentsであることがわかる。ここにファイルを作ってよいが他のアプリでアクセスできないのでこのDocuments下にホルダーを作る。

iphoneのファイルアプリを開き「このiphone内」を選ぶとa-Shellのエントリーが見えるのでそれをタップする。ここでホルダーの新規作成をする。ホルダー名を例えば「python」とする。

a-Shellの画面に戻るとDocuments下にpythonというディレクトリができていることがわかる。そこに移動する。このディレクトリをpythonプログラミングの作業場にする。a-Shellではvimエディターが使えるのでプログラム作成にはこれを使う。

尚最新のiOS5.6では既存のPythonのヴァージョン3.11である。

 

 

opencv-pythonのtempファイルへのアクセス

opencv-pythonはPythonで動画を扱うためのモジュールである。このモジュールを使ってlifegameを高速に描画するプログラムを以前に作った。これをwin10で実行しようとするとエラーがでた。エラーはtmpファイルにアクセスできないことから来てることが分かった。実はwin10ではユーザアカウントのユーザ名に日本語を使っていた。それでtempファイルへのpathに日本語が入ってくる。opencv-pythonは非ascii文字に対応していないことからエラーがででる。ここまでわかった。

対応策(ユーザ名を’花子’とする)

  • 管理者としてコマンドプロンプトを開き、ホルダー’花子’が見えるところまで行き以下のコマンドでsymbolic linkを作る:
mklink /D hanako 花子

これで’花子’の内部のファイルに対してascii文字だけの別名’hanako’経由でアクセスできる。通常tempファイルはこの内部にある。

  • opencv-pytonはtempファイルのある場所を環境変数TEMPまたはTMPに記載されているpathで探す(このpath名に日本語が入っているとエラーがででる)。そこでpath名を変更する)。

ユーザ名’花子’でログインしてコマンドプロンプトの窓を開き以下のコマンドを入力する。

C:\Users\花子>set T
TEMP=C:\Users\花子\AppData\Local\Temp
TMP=C:\Users\花子\AppData\Local\Temp

環境変数TEMP及びTMPのpathに日本語が入っていることがわかる。これを以下のコマンドで変更する。

setx TEMP C:\Users\hanako\AppData\Local\Temp
setx TMP C:\Users\hanako\AppData\Local\Temp

これで環境変数TEMPおよびTMPのpathをascii文字だけで定義できる。

この二つの処理でopencv-pythonは正常に動く。