めもらんだむ

個人的な備忘録。Julia言語やPythonに関することが中心になると思われます。

FortranからPythonを呼ぶ(その2):Intelコンパイラとforpyを組み合わせる

試した環境

mac OS 12.6
ifort (IFORT) 2021.7.0 20220726
Python 3.9.12 :: Intel Corporation

gfortranを使っているQiitaの記事を参考に試してみたところ、いくつか対策が必要になった。
※Qiitaの記事
qiita.com

具体的には、次の3点。

  • forpyのモジュールをリンクする際に、呼ぶPythonのライブラリのパスとして-L/opt/intel/oneapi/intelpython/latest/libを追加しないと、libpython3.9.dynalibがリンクできないために最終的な実行形式ファイルができない
  • 実行ファイルを走らせると、リンクできるはずの上記のライブラリが見つからないと言い出すので、/usr/local/libにlibpython3.9.dynalibのシンボリックリンクを追加
  • 環境変数PYTHONHOMEを設定しないと、python本体を見つけられないらしいので、PYTHONHOMEとして/opt/intel/oneapi/intelpython/latestを設定

2番めのシンボリックリンクを作るところは、付け焼き刃過ぎて後に禍根を残しそう。
人には薦めがたいやり方なので、もっといいやり方を探したい。

FortranからPythonを呼ぶ

普通はf2pyでPythonからFortranを呼ぶことが多いのだろうが、その逆で、FortranからPythonを呼ぶためのFotranモジュールが公開されている。
公開サイトの例ではGNUコンパイラが使われているがIntelコンパイラ(ifort)でも動くらしい。
但し、自分では確認していない。
github.com
実際に試してみた人のリポート:
qiita.com

python-docxを使う(その3)フォントの指定

文書全体で変えたいとき

意識に上ることはあまりないが、MS Wordは、LaTeXのクラスファイルと同じようなファイルで文書のフォーマットを管理しており、スタイルと呼ばれるらしい。多分、スタイルに関する情報も文書ファイル中に埋め込まれているのだと思う。

何も指定しないと英語名称のNormalというスタイルが使われる。日本語名称は「標準」だったと思う。

文書全体で変えたいときは使っているスタイルをカスタマイズする。例えば、游明朝を本文のフォントに使いたい場合

from docx import Document
from docx.oxml.ns import qn

という準備の後に

document = Document()
style = document.styles['Normal']
style.font.name = 'Times New Roman'
style.element.rPr.rFonts.set(qn('w:eastAsia'), '游明朝')

という具合にする。新規のオブジェクトを作った後に、style.font.nameで何らかの英文フォントを先に指定して、その後、日本語のフォントを指定しないといけない点がポイント。

ただ、こうすると、上の例では半角文字ではTimes New Romanを使う。半角文字も游明朝にしたい場合、最後の行の後で

style.font.name = '游明朝'

と、style.font.nameを再定義すると、使えるようになる。

 

参考にしたのは

http://www.jhanmath.com/?p=130

というサイト。中国語のサイトだが、言いたいことは大体伝わる。同じ苦労をしているのだろうと想像される。

 

文書の一部で変えたいとき

以下のようにしたら動いた。

準備として

from docx.oxml.ns import qn

と、qnなるものをimportしておき

paragraph = document.add_paragraph()

pw = paragraph.add_run('あいうえお')

pw.font.name = '游ゴシック Medium'

pw._element.rPr.rFonts.set(qn('w:eastAsia'), pw.font.name)

という具合にすると、add_runで追加した文字のフォントを変えられた。

python-docxを使う(その2)紙のサイズとマージンの指定

MS Wordのデフォルトの紙のサイズはいわゆるレターサイズなので、これをA4サイズに変更する方法。

ついでにマージンの指定の仕方も。

from docx.shared import Mm

document = Document()
section = document.sections[0]
section.page_height = Mm(297)
section.page_width = Mm(210)
section.left_margin = Mm(25.4)
section.right_margin = Mm(25.4)
section.top_margin = Mm(25.4)
section.bottom_margin = Mm(25.4)
section.header_distance = Mm(12.7)
section.footer_distance = Mm(12.7)

stackoverflow.com

python-docx: PythonからMS Wordファイルを操作する

PythonからMS Wordファイルを操作するためのライブラリの一つにpython-docxがある。

ドキュメント:

python-docx — python-docx 0.8.11 documentation

GitHubから入手可能:

github.com

このライブラリから派生したものがいくつもあり、独自の追加機能が施されているものもあると思われるが、数が多いので詳細は不明。

python-docxは2022年9月現在で14ヶ月ほど更新がないので、それほど機能の追加は望めない雰囲気だが、枯れているとも言える。Pythonのバージョンアップに伴う機能変更と齟齬を来さないかはちょっと心配。

pipの使い方に関するメモ

  • pip list
    • インストールしているパッケージリストの表示
  • pip list -o
    • アップデートが出ているパッケージリストの表示:oはoutdatedのo
  • pip install 【パッケージ名】
    • パッケージのインストール
  • pip install -U 【パッケージ名】
    • パッケージのアップデート

参考:

qiita.com

 

pip-reviewというパッケージを入れておくと、outdatedのパッケージを一括更新できるようになる。

参考:

zenn.dev