実験記録 No.02

大阪市在住プログラマ。 翻訳したり、本読んだり。

Pythonでwin32apiをインポートできない場合の対処法

環境

  • Windows 10
  • Python 3.7
  • pypiwin32 バージョン223

エラー状況

PythonからExcelのマクロを実行(COM実行)したくて「pypiwin32」をpipでインストールした。

「pip install pypiwin32」で直接システム上にインストールした場合は問題なく使用できたが、配布パッケージとしてまとめたかったので「pip install pypiwin32 -t ./Lib/site-packages」としてプロジェクトフォルダ内に直接インストールし、Pythonスクリプト内で

import os
import sys

script_path = os.path.dirname(__file__)
sys.path.append(os.path.join(script_path, "Lib/site-packages"))

import win32com.client

としてプロジェクトフォルダ内のpypiwin32を使用したところインポートエラーとなった。エラーメッセージは次の通り。

File "Lib/site-packages\win32com\__init__.py", line 5, in 
    import win32api, sys, os
ModuleNotFoundError: No module named 'win32api'

また修正対応中に以下の様なエラーメッセージも見られらた。

File "Lib/site-packages\win32com\__init__.py", line 5, in 
    import win32api, sys, os
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
File "Lib/site-packages\win32com\__init__.py", line 6, in 
    import pythoncom
  File "Lib/site-packages\pythoncom.py", line 2, in 
    import pywintypes
ModuleNotFoundError: No module named 'pywintypes'

対応方法

Pythonスクリプトを以下のように変更するとインポートエラーを解消できた。

import os
import sys

script_path = os.path.dirname(__file__)
sys.path.append(os.path.join(script_path, "Lib/site-packages"))
sys.path.append(os.path.join(script_path, "Lib/site-packages/win32"))
sys.path.append(os.path.join(script_path, "Lib/site-packages/win32/lib"))
os.environ["PATH"] = os.environ["PATH"] + ";" + os.path.join(script_path , "Lib/site-packages/pywin32_system32")

import win32com.client

win32, win32/libフォルダをPythonのモジュール参照位置に追加し、さらに環境変数PATHにpywin32_system32フォルダを追加することでwin32apiをインポートできるようになった。

参照

Pywin32 does not find its DLL - XD blog

MS Wordでインライン画像を縦方向中央揃えにする方法

Wordでインライン画像を縦方向中央揃えに設定する方法をいつも忘れて、その度に調べてしまうのでメモ。

  1. 画像を選択した状態でリボンの「ページレイアウト」を選択
  2. 「段落」の右にある展開ボタンから段落ダイアログを開く
  3. 段落ダイアログの「体裁」タブで「文字の配置」として「中央揃え」を選択
  4. 段落ダイアログのOKボタンを押して設定を終了
無題

Word 2013で動作確認済み

【日本語訳】宇宙戦争(The War of the Worlds)

宇宙戦争(The War of the Worlds, 1898)
H.G.ウェルズ 著
エンリケ・アルヴィン・コレア 挿絵
H.Tsubota 訳
ライセンス:クリエイティブ・コモンズ・ライセンス 表示 - 非営利 - 継承 4.0 国際

あらすじ

ロンドン近郊に住む著作家の主人公は友人の天文学者とともに火星で起きた異変を観測する。それからまもなく自宅からほど近い共有地に流れ星が落ちる。それは円筒形をした明らかに人工のものだった。主人公はそれを見物に出かけるがそれはロンドンを襲うかつてない危機の始まりだった。

訳者あとがき

「宇宙戦争」は1898年に発表されたH.G.ウェルズによるSF小説である。

地球外生命体とのファーストコンタクトを扱った作品としては最初期のもので、100年以上たった今でも多くの作品に影響を与え続けている。「宇宙人による侵略」「タコのような姿の宇宙人」という後のステレオタイプを形作ったことでもその影響力の大きさはうかがえるだろう。

原題「The War of the Worlds」が示すようにここで描かれるのは「私たちの地球世界」と「やつらの火星世界」の間の戦いである。こうした世界観のせいか現実の戦争とともに想起されることも多いように思う。例えば最初の映画化(1953年公開)は朝鮮戦争期だったし、スピルバーグによる映画化(2005年公開)はイラク戦争期だった。

また兵士が乗った金属製の戦闘マシン、致死的な黒いガス兵器、「飛行機械」などは(作品発表時から見て)近未来である第一次大戦の様相を予言していたと言えるだろう。オーウェルが「一九一四年までのウェルズは大筋においては正真正銘の預言者だった」("ウェルズ、ヒトラー、世界国家", 1941)と書いたようにウェルズの先見性がよく出た作品と言えるのではないだろうか。

翻訳の元となった原書はProject Gutenberg から入手したものを使用している。校正の段階では小田麻紀さんによる翻訳「宇宙戦争」(角川文庫)を参照させていただいた。


宇宙戦争 (コミックス)

宇宙戦争 (字幕版)

FreeCAD バージョン0.18.1がリリース

2019/4/10に前バージョン0.17から約1年ぶりにFreeCAD バージョン0.18.1がリリースされました(3月にリリースされていたバージョン0.18はソースコードのみのリリースでした)。

さっそくインストールしてみたので FreeCAD バージョン0.18リリースノート(英語)も参照しながら主な変更点をまとめておきたいと思います。

ナビゲーションキューブの追加

3Dビューに新たにナビゲーションキューブが追加され、直感的な視点操作が可能になりました。 タッチパネルなどでも操作しやすくなっていると思います。

screenshot1

表示位置や表示・非表示は設定ダイアログで変更することができます。

スケッチ拘束に新たに直径拘束が追加

従来の半径拘束に加えて、直径寸法でスケッチの円を拘束できるようになりました。

screenshot2

またスケッチ全体の平行移動ツールなども追加されています。

スケッチソルバーの機能の改善

スケッチのソルバーが改善され、作業中に拘束が必要なスケッチ要素を選択・確認できるようになりました。

screenshot3

ソルバーメッセージの「自由度」のリンクをクリックすると対応するスケッチ要素が選択されます。

ドラフトワークベンチの改善

一部のツール(シェイプストリングや拡大縮小)が一新され使いやすくなっています。またワイヤーの分割・結合といった新たなツールが追加されています。

Python3 系への移行

比較的大きな変更点としてはPythonコンソールから使用できるPythonのバージョンが従来の2.7系から3系(3.6.6)に変更されています。

またGUIフレームワークとして従来のPySideに加えてPySide2が使用できるようになっています。

screenshot4

多言語化対応の改善

細かい点ですがGUIのボタンの「キャンセル」、「閉じる」などのテキストが多言語対応して、操作時の違和感がより少なくなりました。

screenshot5-v018 screenshot5-v017

上図の左側がバージョン0.18.1、右側がバージョン0.17です。

その他

他にも 建築ワークベンチ、FEMワークベンチ、パス・ワークベンチなどで多くの機能改善が行われているようです。

以上です。FreeCAD バージョン0.18.1は GitHub の FreeCAD リリースページからダウンロード可能です。

【2019年版】FreeCAD利用事例まとめ

「FreeCADってどれくらいのことができるの?」という質問をたまにもらうのでTwitterの自分のタイムラインからFreeCADの利用事例に関するものをまとめました。2019年版。

2018年以前の分は【2018年版】FreeCAD利用事例まとめで。




























Twitterタイムライン