mini-pix 0.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,684 @@
1
+ Metadata-Version: 2.4
2
+ Name: mini-pix
3
+ Version: 0.1.3
4
+ Summary: mini pix ctrl server
5
+ Author-email: Kengo NAKADA <kengo.nakada@email.com>
6
+ Requires-Python: >=3.7
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: xlogger-py
9
+ Requires-Dist: grpc-frame
10
+ Requires-Dist: numpy
11
+ Requires-Dist: tifffile
12
+ Requires-Dist: h5py
13
+ Requires-Dist: coloredlogs
14
+ Requires-Dist: colorlog
15
+ Requires-Dist: pytest
16
+ Requires-Dist: pytest-asyncio
17
+ Requires-Dist: setuptools
18
+ Requires-Dist: python-dotenv
19
+ Requires-Dist: fastapi
20
+ Requires-Dist: fastapi-utils
21
+ Requires-Dist: uvicorn
22
+ Requires-Dist: pydantic
23
+ Requires-Dist: starlette
24
+ Requires-Dist: requests
25
+ Requires-Dist: aiohttp
26
+ Requires-Dist: httpx
27
+ Requires-Dist: pyyaml
28
+ Requires-Dist: toml
29
+ Requires-Dist: nest_asyncio
30
+ Requires-Dist: sphinx
31
+ Requires-Dist: myst-parser
32
+ Requires-Dist: sphinx-autobuild
33
+ Requires-Dist: sphinx-rtd-theme
34
+ Requires-Dist: sphinxcontrib-napoleon
35
+ Requires-Dist: linkify-it-py
36
+ Provides-Extra: view
37
+ Requires-Dist: PyQt5; extra == "view"
38
+
39
+ # mini_pix
40
+
41
+ ADVACAM MiniPIX / Timepix を PIXet Python API から制御し、ローカル制御および `grpc_frame` を用いたリモート制御を行うための Python パッケージです。
42
+
43
+ v0.1.0 は、MiniPIX 実機を接続したサーバーと別マシンのクライアント間で、 以下の動作を確認した最初の基準版です。
44
+
45
+ - Frames 測定
46
+ - Integral 測定
47
+ - リモート VIEW
48
+ - クライアント側 TIFF / PNG 保存
49
+
50
+ ## アーキテクチャ
51
+
52
+ `mini_pix` は、検出器を直接扱うローカル制御層と、gRPC を介したリモート制御層を分離しています。
53
+
54
+ ```text
55
+ Client
56
+ |
57
+ | grpc_frame / gRPC
58
+ v
59
+ MiniPIX Server
60
+ |
61
+ v
62
+ MiniPixCtrl
63
+ |
64
+ v
65
+ PIXet Python API (pypixet)
66
+ |
67
+ v
68
+ MiniPIX / Timepix
69
+ ```
70
+
71
+ サーバー側では PIXet Python API と MiniPIX 実機が必要です。
72
+
73
+ クライアント側では PIXet Python API および `pypixet` は不要です。 `mini_pix.server_grpc` はクライアント API の import 時にサーバー実装を読み込まず、 `pixet_grpc_server` または `pixet_server` が必要になった時だけサーバー実装を遅延 import します。
74
+
75
+ ## v0.1.0 に至るまでの経緯
76
+
77
+ v0.1.0 は、従来の v0.0.x 系をそのまま拡張した版ではありません。
78
+
79
+ v0.0.4 までに DeviceProxy、Frames、Integral、gRPC client などは実装され、次版を v0.0.5 とする想定で開発を進めていました。しかし、それまでの確認にはX線を入れない試験が含まれており、通信や API 呼び出しが完了することと、検出器として正しい画像が得られることを十分に分離して検証できていませんでした。
80
+
81
+ その後、実際にX線を入れて PIXet Pro GUI と Python API の取得画像を比較したところ、Python 側が公式 GUI の挙動を再現していないことが判明しました。このため旧実装へ修正を積み重ねず、PIXet Python API の最小ローカルコードまで戻り、実機制御を段階的に再構築しました。
82
+
83
+ 再設計の順序は、PIXet Pro GUI での基準動作確認、最小 API コード、calibration / device configuration、raw frame、GUI 表示、複数 frame、class 化、callback、保存、Integral、`MiniPixCtrl` への統合、最後に gRPC / remote VIEW、です。この再構築後の実装を v0.1.0 とし、以後の基準版とします。
84
+
85
+ ### 再設計時のローカル検証コード
86
+
87
+ - `01a.py`: PIXet core 起動、実機認識、mode / threshold、`doSimpleAcquisition()` の基本動作を最小構成で確認。
88
+ - `01b_tiff.py`: GUI の基準条件に合わせ、`PX_FTYPE_NONE` から `frame.data()` を直接取得し raw TIFF として保存。SDK の画像出力と raw detector data を分離して確認。
89
+ - `01b_gui_memory.py`: memory frame を直接表示。raw data と表示処理を分離し、PIXet GUI と上下方向を合わせる処理、Auto / Manual range、Nearest / Smooth を検証。
90
+ - `01c_gui_memory.py`: device 初期化、設定、1 frame 取得を GUI から関数として分離。
91
+ - `01d_gui_function.py`: 複数 frame の一括取得と、測定終了後の全 frame 取得を関数として整理。
92
+ - `01e_gui_class.py`: PIXet / MiniPIX の初期化、設定、測定、終了処理を GUI 非依存 class にまとめ、制御層と表示層を分離。
93
+ - `01f_gui_callback.py`: `PX_EVENT_ACQ_FINISHED` を使い、Frames 測定中に各 frame を callback で取得。callback なしの測定終了後取得も維持。
94
+ - `01g_gui_save_intAcq.py`: TIFF / HDF5 / PIXet native、Stop / state、Integral を追加。Integral は `doSimpleIntegralAcquisition()` を使用し、Python 側では積算しない方式を確立。
95
+
96
+ この系列は別実装ではなく、現在の `pixet_ctrl.py`、`view_local.py`、`view_client.py` に至る実機検証・再設計の過程です。
97
+
98
+ ## 主なモジュール
99
+
100
+ ### `mini_pix.pixet_ctrl.MiniPixCtrl`
101
+
102
+ MiniPIX / Timepix のローカル制御クラスです。
103
+
104
+ gRPC、GUI、server/client 設定は扱わず、PIXet Python API を直接使用します。
105
+
106
+ 主な機能:
107
+
108
+ - `connect()` / `disconnect()`
109
+ - `set_mode_all()`
110
+ - `set_threshold()`
111
+ - `set_clock()`
112
+ - `set_bias()`
113
+ - `acquire()`
114
+ - `acquire_frames()`
115
+ - `acquire_integral()`
116
+ - `stop()`
117
+ - `is_running()`
118
+ - `is_aborting()`
119
+ - `state()`
120
+ - `clear_frames()`
121
+ - `get_frame_count()`
122
+ - `get_frame()`
123
+ - `get_frames()`
124
+ - `get_current_frame()`
125
+ - `get_acq_frame_count()`
126
+ - `get_acq_frames()`
127
+
128
+ `MiniPixCtrl` の `logger` は必須です。
129
+
130
+ ### Frames 測定
131
+
132
+ 通常のフレーム測定です。
133
+
134
+ ```python
135
+ result = ctrl.acquire_frames(
136
+ count,
137
+ sec,
138
+ )
139
+ ```
140
+
141
+ PIXet の acquisition event を利用できる場合は、 `PX_EVENT_ACQ_FINISHED` ごとに最新フレームを取得し、callback に渡します。
142
+
143
+ ### Integral 測定
144
+
145
+ ```python
146
+ result = ctrl.acquire_integral(
147
+ count,
148
+ sec,
149
+ )
150
+ ```
151
+
152
+ Integral は PIXet の `doSimpleIntegralAcquisition()` を使用します。 Python 側で Frames の画像を加算して Integral を生成する実装ではありません。
153
+
154
+ callback を指定した場合も、Integral では最終積算フレームに対して1回だけ呼び出されます。
155
+
156
+ ## フレームデータ
157
+
158
+ 取得フレームは辞書として扱います。
159
+
160
+ 主な要素は次のとおりです。
161
+
162
+ ```text
163
+ name
164
+ width
165
+ height
166
+ data
167
+ minimum
168
+ maximum
169
+ nonzero
170
+ subframes
171
+ ```
172
+
173
+ `data` は NumPy の2次元配列です。
174
+
175
+ 検出器から取得した配列は保存用 raw data として保持し、 表示のための変換とは分離します。
176
+
177
+ ## 保存
178
+
179
+ `MiniPixCtrl.acquire()` / `acquire_frames()` / `acquire_integral()` は、 サーバー側保存として次を扱います。
180
+
181
+ ```text
182
+ NONE
183
+ TIFF
184
+ HDF5
185
+ PIXET_NATIVE
186
+ ```
187
+
188
+ ### TIFF
189
+
190
+ 1 frame を 1 TIFF として保存します。
191
+
192
+ 表示用の正規化などを行わず、取得した数値配列をそのまま `tifffile` で保存します。
193
+
194
+ ### HDF5
195
+
196
+ Frames 測定ではフレームごとに dataset へ追記し、逐次 `flush()` します。
197
+
198
+ Integral 測定では最終積算フレームを保存します。
199
+
200
+ dataset の dtype は取得した NumPy 配列の dtype を使用します。
201
+
202
+ ### PIXET_NATIVE
203
+
204
+ PIXet 自身のファイル保存機能を使用します。
205
+
206
+ ## gRPC
207
+
208
+ ### サーバー
209
+
210
+ `mini_pix.server_grpc.pixet_grpc_server()` が `MiniPixCtrl` を生成し、 `grpc_frame.grpc_server.create_grpc_server()` に公開します。
211
+
212
+ 通常の制御 API は unary RPC として公開されます。
213
+
214
+ Frames / Integral の逐次画像転送には `grpc_frame` の `StreamCall` を使用します。
215
+
216
+ サーバー起動例は `example/start_minipix_server.py` です。
217
+
218
+ ```python
219
+ from mini_pix.config import Config
220
+ from mini_pix.server_grpc import pixet_grpc_server
221
+ from x_logger import XLogger
222
+
223
+ config = Config("mini_pix.yaml")
224
+
225
+ logger = XLogger(
226
+ log_level=config.LOGGER_LEVEL,
227
+ logger_name=config.SERVER_LOGGER_NAME,
228
+ )
229
+
230
+ pixet_grpc_server(
231
+ grpc_host=config.SERVER_IP,
232
+ grpc_port=config.SERVER_PORT,
233
+ auto_connect=True,
234
+ logger=logger,
235
+ log_level=config.LOGGER_LEVEL,
236
+ )
237
+ ```
238
+
239
+ ### DeviceProxy
240
+
241
+ `mini_pix.server_grpc` は `grpc_frame.DeviceProxy` に MiniPIX client を登録します。
242
+
243
+ 標準名:
244
+
245
+ ```text
246
+ mini_pix
247
+ ```
248
+
249
+ alias:
250
+
251
+ ```text
252
+ pixet
253
+ MiniPix
254
+ MiniPixCtrl
255
+ pixet_grpc
256
+ ```
257
+
258
+ 同期 client の例:
259
+
260
+ ```python
261
+ from mini_pix.server_grpc import DeviceProxy
262
+
263
+ client = DeviceProxy(
264
+ "mini_pix",
265
+ server_ip="10.170.10.38",
266
+ server_port=50051,
267
+ set_timeout_sec=30.0,
268
+ async_mode=False,
269
+ )
270
+ ```
271
+
272
+ `async_mode=False` では `SyncPixetGrpcClient`、 `async_mode=True` では `AsyncPixetGrpcClient` を使用します。
273
+
274
+ ### Client-side save
275
+
276
+ `SyncPixetGrpcClient` / `AsyncPixetGrpcClient` の `acquire_frames()` と `acquire_integral()` は、クライアント側保存に対応します。
277
+
278
+ ```python
279
+ client.acquire_frames(
280
+ 1,
281
+ 1.0,
282
+ name="frame.tiff",
283
+ save_local=True,
284
+ return_data=False,
285
+ )
286
+ ```
287
+
288
+ 対応するクライアント側保存形式:
289
+
290
+ - `.tif`
291
+ - `.tiff`
292
+ - `.png`
293
+
294
+ TIFF は raw 数値配列を保存します。
295
+
296
+ PNG は表示用としてフレームごとに min-max 正規化し、 16 bit grayscale PNG として保存します。
297
+
298
+ ## VIEW
299
+
300
+ ### `example/view_local.py`
301
+
302
+ `MiniPixCtrl` を直接使用するローカル VIEW です。
303
+
304
+ gRPC を使用せず、`MiniPixCtrl` の callback からフレームを受け取ります。
305
+
306
+ ### `example/view_client.py`
307
+
308
+ 別マシンから gRPC 経由で使用する VIEW です。
309
+
310
+ - Frames / Integral 切り替え
311
+ - count / acquisition time 設定
312
+ - detector mode / threshold / bias / clock 設定
313
+ - `StreamCall` によるフレーム受信
314
+ - 受信済みフレームのローカル履歴
315
+ - slider と前後ボタンによる履歴表示
316
+ - Auto / Manual display range
317
+ - nearest / smooth 表示
318
+ - Stop
319
+
320
+ クライアント VIEW は `pypixet` を必要としません。
321
+
322
+ ## example
323
+
324
+ ### `measure_simple.py`
325
+
326
+ Frames 測定の同期クライアント例です。
327
+
328
+ 現在のサンプル設定:
329
+
330
+ ```text
331
+ Mode : Counting
332
+ Threshold : 5.0 keV
333
+ Bias : 150 V
334
+ Clock : 9.66667 MHz
335
+ Count : 1
336
+ Time : 1.0 s
337
+ ```
338
+
339
+ TIFF 保存が有効で、PNG 保存例はコメントとして残しています。
340
+
341
+ ### `measure_integral.py`
342
+
343
+ Integral 測定の同期クライアント例です。
344
+
345
+ 現在のサンプル設定:
346
+
347
+ ```text
348
+ Mode : Counting
349
+ Threshold : 5.0 keV
350
+ Bias : 150 V
351
+ Clock : 9.66667 MHz
352
+ Count : 1
353
+ Time : 10.0 s
354
+ ```
355
+
356
+ TIFF 保存が有効で、PNG 保存例はコメントとして残しています。
357
+
358
+ ### `start_minipix_server.py`
359
+
360
+ `mini_pix.yaml` を読み込み、MiniPIX gRPC server を起動します。
361
+
362
+ ## 設定ファイル
363
+
364
+ `example/mini_pix.yaml` の現在の項目:
365
+
366
+ ``` yaml
367
+ SERVER_IP: "10.170.10.38"
368
+ SERVER_PORT: 50051
369
+ CLIENT_LOGGER_NAME: "mini_pix_client"
370
+ SERVER_LOGGER_NAME: "mini_pix_server"
371
+ TIMEOUT: 30.0
372
+ LOGGER_LEVEL: "debug"
373
+ ASYNC_MODE: false
374
+ ```
375
+
376
+ IP address などは使用環境に合わせて変更してください。
377
+
378
+ ## v0.1.0 で確認済みの構成
379
+
380
+ v0.1.0 では、MiniPIX / PIXet を接続したサーバーと別マシンのクライアント間で、
381
+
382
+ - `view_client.py`
383
+ - `measure_simple.py`
384
+ - `measure_integral.py`
385
+
386
+ の動作を確認しています。
387
+
388
+ これは v0.1.0 の基準動作とします。
389
+
390
+ ------------------------------------------------------------------------
391
+
392
+ ## PIXet / pypixet セットアップ
393
+
394
+ ## Calibration / device configuration
395
+
396
+ MiniPIX では Python API が import でき、実機が認識されるだけでは十分ではありません。対象個体に対応する device configuration / calibration XML が正しくロードされることが重要です。
397
+
398
+ 今回の対象は次の実機です。
399
+
400
+ ```text
401
+ Device : MiniPIX D08-W0313
402
+ Serial : 2746
403
+ Chip : Timepix
404
+ Sensor : Si, 500 µm
405
+ ```
406
+
407
+ ### X線実測で判明した問題
408
+
409
+ 公式 PIXet Pro GUI では、次の条件で正常な画像を確認しました。
410
+
411
+ ```text
412
+ Mode : Counting
413
+ Threshold : 2.4 keV
414
+ Bias : 150 V
415
+ Clock : 9.66667 MHz
416
+ Time : 1 s
417
+ ```
418
+
419
+ 同じ実機を Python API から操作した初期の最小コードでは、X線を入れた実測時に GUI と同じ画像挙動を再現できませんでした。mode、threshold、bias、clock の値だけを合わせても解決せず、個体固有 XML のロードが重要な差であることが判明しました。
420
+
421
+ ### USB 付属 Calibration XML
422
+
423
+ 付属USBには個体用ファイル
424
+
425
+ ```text
426
+ Calibration/MiniPIX-D08-W0313.xml
427
+ ```
428
+
429
+ があります。API 環境ではこれを PIXet API ディレクトリの `factory` に配置します。
430
+
431
+ ```text
432
+ C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64
433
+ └─ factory
434
+ └─ MiniPIX-D08-W0313.xml
435
+ ```
436
+
437
+ この配置後、Python API の取得画像の挙動は公式 GUI にほぼ一致しました。
438
+
439
+ したがって v0.1.0 のサーバー環境では、Python 3.7、DLL、`pixet.ini` だけでなく、使用する MiniPIX 個体に対応する XML の配置までをセットアップの一部として扱います。
440
+
441
+ ### `factory` と `configs`
442
+
443
+ PIXet core は保存済みの `configs` を優先して読み、使用可能な設定がない場合に `factory` の個体初期設定を使用します。`configs` は終了処理で生成・更新され、次回起動時の現在設定として使用されます。
444
+
445
+ したがって、`factory` の個体用 calibration XML と、PIXet が実行後に `configs` に保存した XML は役割が異なります。また、公式 GUI が使用・保存した XML と Python API 側で生成された XML には実際に項目・値の差が確認されたため、両者を同一ファイルとして扱いません。
446
+
447
+ この問題は単なるインストール上の注意ではなく、v0.0.x 系から v0.1.0 へ再設計する直接の契機です。以後、API/通信の成功や画像ファイル生成だけで検出器制御の正しさを判断せず、公式 GUI と同じ実機・測定条件でX線画像を比較することを実機検証の基準とします。
448
+
449
+ 以下は MiniPIX を直接接続するサーバー側のセットアップ情報です。
450
+
451
+ ### PIXet Install
452
+
453
+ ### Downloads
454
+
455
+ - [Advacam Downloads](https://advacam.com/downloads/)
456
+ - もしくは付属のUSB
457
+
458
+ ### ドライバなどの導入
459
+
460
+ - シリアルドライバ: USB の Drivers ディレクトリ以下の setup を実行(検出器は外した状態で入れる
461
+ - GUIの導入 & ドライバ: USB の Pixet/Pixet_pro_windows の実行
462
+ - 再起動
463
+
464
+ ### Python API のための準備
465
+
466
+ - [Microsoft Visual C++ Redistributable 2015--2022 (x64)](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-c-v14-redistributable)
467
+
468
+ ### Python API の導入
469
+
470
+ - python 3.7 が必要([pyenv-win](https://qiita.com/probabilityhill/items/9a22f395a1e93206c846) で導入をお勧めします)
471
+ - [Python API](#python-api-の導入など)
472
+ - `c:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64` を準備
473
+
474
+ ## AdvaCam Docs
475
+
476
+ - [PIXet](https://wiki.advacam.cz/wiki/PIXet)
477
+ - [Pixet SDK](https://wiki.advacam.cz/wiki/Pixet_SDK)
478
+ - [Pixet Python API](https://wiki.advacam.cz/wiki/Python_API)
479
+
480
+ ------------------------------------------------------------------------
481
+
482
+ ## Python API の導入など
483
+
484
+ - Pixet の情報(python)
485
+ - <https://wiki.advacam.cz/wiki/Pixet_SDK>
486
+ - <https://wiki.advacam.cz/wiki/Python_API>
487
+
488
+ Pixset フォルダにある API の zip を展開するとえられる doc PDF 集がある。
489
+
490
+ USB ファイルの Piext フォルダにある ZIP ファイルを展開することで 得られる。pip や setup.py などは存在しないために、 基本的にモジュールファイル(zip解凍で得られる) があるところでも python プログラムを実行するか、後述する形で `site.addsitedir(pixet_dir)` などとして使えるようにする
491
+
492
+ ### モジュールの本体
493
+
494
+ - pypixet.pyd: 設定、測定、ステータス情報の取得など、すべての基本的なデバイス機能のための基本API
495
+ - pypxproc.pyd: ピクセル処理。クラスタリングおよびスペクトルイメージングオブジェクトで使用
496
+
497
+ ### ログディレクトリ
498
+
499
+ プログラム実行したディレクトリの logs サブディレクトリ
500
+
501
+ ### その他モジュールを使うときに必要になるファイル
502
+
503
+ - pixet.ini: プログラムと同じディレクトリ
504
+
505
+ ``` ini
506
+ [Settings]
507
+ Splash=false
508
+
509
+ [Hwlibs]
510
+ fitpix.dll
511
+ minipix.dll
512
+ widepix.dll
513
+ zem.dll
514
+ zest.dll
515
+ ```
516
+
517
+ ### 依存ファイル
518
+
519
+ xcore.dll の依存DLL
520
+
521
+ ```text
522
+ mfc110.dll
523
+ mfcloop.dll
524
+ msvcp120.dll
525
+ msvcp140.dll
526
+ msvcr110.dll
527
+ msvcr120.dll
528
+ vccorlib140.dll
529
+ vcruntime140.dll
530
+ ```
531
+
532
+ ## Pixet の導入に関しての紆余曲折
533
+
534
+ ### 付属USBにある主なファイル
535
+
536
+ - PIXet_Pro_1.8.3_Windows_x86_64: GUIアプリケーション本体(通常ユーザー用)
537
+ - API_PIXet_Pro_1.8.3_Windows_x86_64: 開発者向けパッケージ(Python / C / C++ から制御するためのSDK一式)
538
+
539
+ API_PIXet_Pro を展開したフォルダにて python を実行すると(実行の仕方はいろいろある、後で記述する)、 以下のランタムがないのでうまく動かない。
540
+
541
+ ```text
542
+ VCRUNTIME140.dll
543
+ VCRUNTIME140_1.dll
544
+ MSVCP140.dll
545
+ ```
546
+
547
+ が足りない。 つまり、[Microsoft Visual C++ Redistributable 2015--2022 (x64)](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-c-v14-redistributable)を入れる必要がある。
548
+
549
+ しかし、基本ランタイムを入れても、まだ足りない。次に、pypiex モジュールの元である pyd を調査する。
550
+
551
+ ```python
552
+ import pefile
553
+
554
+ # pyd の依存DLL調査
555
+ pe = pefile.PE(r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64\pypixet.pyd")
556
+
557
+ for entry in pe.DIRECTORY_ENTRY_IMPORT:
558
+ print(entry.dll.decode())
559
+ ```
560
+
561
+ で調査すると
562
+
563
+ ```text
564
+ PS C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64> python .\b.py
565
+ python37.dll
566
+ MSVCP140.dll
567
+ WSOCK32.dll
568
+ WS2_32.dll
569
+ KERNEL32.dll
570
+ VCRUNTIME140.dll
571
+ VCRUNTIME140_1.dll
572
+ api-ms-win-crt-runtime-l1-1-0.dll
573
+ api-ms-win-crt-stdio-l1-1-0.dll
574
+ api-ms-win-crt-filesystem-l1-1-0.dll
575
+ api-ms-win-crt-time-l1-1-0.dll
576
+ api-ms-win-crt-heap-l1-1-0.dll
577
+ api-ms-win-crt-string-l1-1-0.dll
578
+ PS C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64>
579
+ ```
580
+
581
+ となる。つまりpython3.7 で Pypiext はビルドされている。 つまり python3.7 を導入しないとこのモジュールは使えない。
582
+
583
+ pyenv install 3.7.9
584
+
585
+ 問題は、3.7.9 では add_dll_directory が使えないのでパスを変更する
586
+
587
+ ```python
588
+ # python <= 3.7
589
+ import os
590
+ import site
591
+ pixet_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
592
+
593
+ # Python 3.7 では add_dll_directory は使えないため PATH を変更
594
+ os.environ["PATH"] = pixet_dir + ";" + os.environ["PATH"]
595
+ site.addsitedir(pixet_dir) # .pyd を import 可能にする
596
+ import pypixet
597
+ print("OK")
598
+ ```
599
+
600
+ とすると、git のプロジェクトは別のところにあるモジュールを使えるようになる。
601
+
602
+ ## python のバージョンを pyd とそろえるときの情報調査スクリプト
603
+
604
+ ### python >= 3.8
605
+
606
+ ```python
607
+ # 任意のディレクトリで指定のフォルダのpydが使えるものか調べる
608
+ # python のバージョンを pyd とそろえる必要がある。
609
+
610
+ # python >= 3.8
611
+ import os
612
+ import ctypes
613
+ dll_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
614
+ os.add_dll_directory(dll_dir)
615
+ ctypes.WinDLL(r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64\pypixet.pyd")
616
+ print("OK")
617
+ ```
618
+
619
+ ### python <= 3.7
620
+
621
+ ```python
622
+ # 任意のディレクトリで指定のフォルダのpydが使えるものか調べる
623
+ # python のバージョンを pyd とそろえる必要がある。
624
+
625
+ # python <= 3.7
626
+ import os
627
+ import ctypes
628
+ dll_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
629
+ os.environ["PATH"] = dll_dir + ";" + os.environ["PATH"]
630
+ ctypes.WinDLL(os.path.join(dll_dir, "pypixet.pyd"))
631
+ print("OK")
632
+ ```
633
+
634
+ ------------------------------------------------------------------------
635
+
636
+ ## 任意の場所にあるモジュールを動かす方法(まとめ)
637
+
638
+ ### python >= 3.8
639
+
640
+ ```python
641
+ # モジュールディレクトリを別の場所に置くときでもつかえる
642
+ # python >= 3.8
643
+ import os
644
+ pixet_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
645
+ os.add_dll_directory(pixet_dir)
646
+ import site
647
+ site.addsitedir(pixet_dir)
648
+ import pypixet
649
+ print("OK")
650
+ ```
651
+
652
+ ### python <= 3.7
653
+
654
+ ```python
655
+ # モジュールディレクトリを別の場所に置くときでもつかえる
656
+
657
+ # python <= 3.7
658
+ import os
659
+ import site
660
+ pixet_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
661
+
662
+ # Python 3.7 では add_dll_directory は使えないため PATH を変更
663
+ os.environ["PATH"] = pixet_dir + ";" + os.environ["PATH"]
664
+ site.addsitedir(pixet_dir) # .pyd を import 可能にする
665
+ import pypixet
666
+ print("OK")
667
+ ```
668
+
669
+ ### PIXet 2026.03 付属USBからの導入 module3
670
+
671
+ - python **3.7** の導入
672
+ - [Microsoft Visual C++ Redistributable 2015--2022 (x64)](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-c-v14-redistributable) 導入
673
+
674
+ 以下の形で pypiext を使う
675
+
676
+ ```python
677
+ import os
678
+ import site
679
+ pixet_dir = r"C:\opt\ese774\modules\API_PIXet_Pro_1.8.3_Windows_x86_64"
680
+ os.environ["PATH"] = pixet_dir + ";" + os.environ["PATH"]
681
+ site.addsitedir(pixet_dir) # .pyd を import 可能にする
682
+
683
+ import pypixet
684
+ ```