はじめに
Pythonは生成AI関連のアプリやデータ分析の分野など幅広く使われているスクリプト言語です。最近はこの言語はz/OS上でも動かせるようになっています。
具体的には、IBM Open Enterprise SDK for Pythonという無償製品が提供されており、これを使用することによりz/OS Unix System Service環境でPythonスクリプトを実行することができます。
実際にz/OS上でPythonを使用する上で気になる点について、調査、考察したこと、雑多なメモなどを残しておきます。
z/OSには、従来からいわゆるトラディショナルな使い方をする部分(データセット、JES...)と、Unix互換のインターフェースが提供される部分があります。ここでは、前者をMVS環境、後者をUSS(Unix System Service)環境と呼びます。
- MVS環境: データセット、JESの操作など、主にSDSFやISPFなどの3270インターフェース(PCOM)で扱う環境
- USS環境: シェル、zFSなど、主にSSH経由で扱うUnix互換環境
Pythonは基本的にUSS環境で扱うことになります。
※MVS/USSについては以下の記事もご参照ください。
z/OS技術者が学ぶべきオープンな技術 ~USSの活用~
インストール
製品のインストールについては以前別記事で記載していますのでそちらをご参照ください。バージョンによって細かな差異はあると思いますが、基本的な流れは同様だと思います。
Python for z/OS のインストール
Python環境情報
基本的には以下の環境で試しています。
z/OS 3.1
Python 3.12.8
pip 24.3.1
参考
IBMUSER:/u/ibmuser # python --version
IBM Open Enterprise SDK for Python 3.12.8
IBMUSER:/u/ibmuser # pip --version
pip 24.3.1 from /usr/lpp/IBM/cyp/v3r12/pyz/lib/python3.12/site-packages/pip (python 3.12)
IBMUSER:/u/ibmuser # pip list
Package Version
------------ -------
cffi 1.17.1
cryptography 3.3.2
ibm_db 3.2.6
pip 24.3.1
pycparser 2.20
setuptools 78.1.0
six 1.16.0
wheel 0.45.1
zoautil_py 1.3.4.1
Pythonスクリプト実行について
Python仮想環境
参考: Virtual environments and considerations
PC上でPythonを利用する際は、プロジェクトや作業単位ごとに仮想環境を作ってその仮想環境でPythonスクリプトを実行するのが定跡だと思います。
z/OSでのPythonは基本的にUSS上で扱うことになりますが、PCやLinux等で実行するのと同様に仮想環境を作成してPythonを実行することができます。
仮想環境作成例:
IBMUSER:/u/ibmuser/Python # python -m venv venv_test01
IBMUSER:/u/ibmuser/Python # ls -la venv_test01
total 96
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:38 .
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 17 05:38 ..
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 17 05:39 bin
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 17 05:38 include
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 17 05:38 lib
lrwxrwxrwx 1 BPXROOT SYS1 3 Sep 17 05:38 lib64 -> lib
-rw-r--r-- 1 BPXROOT SYS1 233 Sep 17 05:38 pyvenv.cfg
仮想環境のアクティベート
IBMUSER:/u/ibmuser/Python # . ./venv_test01/bin/activate
(venv_test01) IBMUSER:/u/ibmuser/Python #
上のようにプロンプトの前にカッコ書きの仮想環境名が表示されればOK
(venv_test01) IBMUSER:/u/ibmuser/Python # python --version
IBM Open Enterprise SDK for Python 3.12.8
(venv_test01) IBMUSER:/u/ibmuser/Python # pip list
Package Version
------- -------
pip 24.3.1
仮想環境作成時に--system-site-packagesオプションを指定すると、Enterprise SDK for Pythonに含まれて提供されるパッケージ(Global環境でインストールされているパッケージ)を引き継いで仮想環境を作成できます。
IBMUSER:/u/ibmuser/Python # python -m venv venv_test02 --system-site-packages
IBMUSER:/u/ibmuser/Python # . ./venv_test02/bin/activate
(venv_test02) IBMUSER:/u/ibmuser/Python # pip list
Package Version
------------ -------
cffi 1.17.1
cryptography 3.3.2
ibm_db 3.2.6
pip 24.3.1
pycparser 2.20
setuptools 78.1.0
six 1.16.0
wheel 0.45.1
zoautil_py 1.3.4.1
Pythonスクリプトの作成(文字コード設定)
参考:
Getting started with IBM Open Enterprise SDK for Python
Codesets and translation
Environment variables for pax archive installation
Pythonスクリプトは通常USS上のファイルとしてコーディングすることになると思います。USS上のファイルはデフォルトだとEBCDICで扱われることになります。Python環境では基本的にUTF-8で処理されますので、UTF-8でスクリプトを作成するのがよいと思いますが、EBCDICでもコーディング可能です。ただし、いずれにしても以下の環境変数を指定し、かつ、ファイルにタグ付けをして明示的に文字コードを指定しておく必要があります。
環境変数
export _BPXK_AUTOCVT='ALL'
export _CEE_RUNOPTS='FILETAG(AUTOCVT,AUTOTAG) POSIX(ON)'
※マニュアル上では _BPXK_AUTOCVT='ON' の指定になっていますが、_BPXK_AUTOCVT='ALL'の指定をおすすめします(Unicode対応のため)。
参考:
_BPXK environment variables
ALL
Activates the automatic conversion of tagged files that are supported by Unicode Services. This option affects conversion for I/O for regular and pipe files that are tagged. Setting or unsetting ALL has no effect after conversion for a file begins. If the conversion is between EBCDIC and ASCII, this option also affects conversion for I/O for character-special files.
EBCDICのPythonスクリプトファイルにタグ付けしてみる
(venv_test02) IBMUSER:/u/ibmuser/Python # chtag -tc IBM-1047 test_script_ebcdic_enc.py
(venv_test02) IBMUSER:/u/ibmuser/Python # ls -laT
total 96
drwxr-xr-x 4 BPXROOT SYS1 8192 Sep 17 07:24 .
drwxr-xr-x 8 BPXROOT SYS1 8192 Sep 17 05:49 ..
t IBM-1047 T=on -rw-r--r-- 1 BPXROOT SYS1 79 Sep 17 07:23 test_script_ebcdic_enc.py
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:38 venv_test01
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:49 venv_test02
(venv_test02) IBMUSER:/u/ibmuser/Python # cat test_script_ebcdic_enc.py
def main():
print("hello world!")
if __name__ == "__main__":
main()
上のEBCDICのファイルをコード変換してUTF-8のファイルも作成し、タグ付けしてみる
(venv_test02) IBMUSER:/u/ibmuser/Python # iconv -f IBM-1047 -t UTF-8 test_script_ebcdic_enc.py > test_script_utf8_enc.py
(venv_test02) IBMUSER:/u/ibmuser/Python # chtag -tc UTF-8 test_script_utf8_enc.py
(venv_test02) IBMUSER:/u/ibmuser/Python # ls -laT
total 96
drwxr-xr-x 4 BPXROOT SYS1 8192 Sep 17 07:24 .
drwxr-xr-x 8 BPXROOT SYS1 8192 Sep 17 05:49 ..
t IBM-1047 T=on -rw-r--r-- 1 BPXROOT SYS1 79 Sep 17 07:23 test_script_ebcdic_enc.py
t UTF-8 T=on -rw-r--r-- 1 BPXROOT SYS1 79 Sep 17 07:32 test_script_utf8_enc.py
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:38 venv_test01
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:49 venv_test02
(venv_test02) IBMUSER:/u/ibmuser/Python # cat test_script_utf8_enc.py
def main():
print("hello world!")
if __name__ == "__main__":
main()
補足:
chtagコマンドによりファイルに対するタグの設定(文字コード指定など)が行えますし、lsコマンドの-Tオプションを指定することでタグの確認が行えます。
スクリプト実行
適切なタグ付けがされていれば、EBCDICのファイルもUTF-8のファイルもPythonスクリプトとして実行可能。
(venv_test02) IBMUSER:/u/ibmuser/Python # python test_script_ebcdic_enc.py
hello world!
(venv_test02) IBMUSER:/u/ibmuser/Python # python test_script_utf8_enc.py
hello world!
パッケージについて
一般的なパッケージの管理
まず、一般的な分散系プラットフォームでのPythonパッケージ管理方法についておさらいしておきます。
通常、Pythonスクリプトでなんらかの機能を実装する際には、import文を使用して既存機能を利用してコーディングを行います。よく使われる機能は"パッケージ"という単位で公開されており、自由にダウンロードして利用できるようになっています。これがOSSの非常に便利なところですね。
公開されているPythonのパッケージはPyPI(Python Package Index)と呼ばれるPythonコミュニティによって運営されている公式リポジトリから入手することができます。
Pythonパッケージは通常whl(wheel)ファイルと呼ばれるバイナリ形式のフォーマットで管理されます。
公開されているパッケージを使用したい場合、事前にPython環境(仮想環境)にて、pip installコマンドでパッケージをインストールすることになります。pip installコマンドでは、デフォルトでPyPIリポジトリを参照しにいき、そこからパッケージをダウンロードしてインストールするという動きになります。
あるパッケージを使いたいという時に、そのパッケージが単体では動作できずに別のパッケージが前提となっている場合があります。つまりパッケージには依存関係が含まれることがあります。pip installコマンドで特定のパッケージを指定してインストールしようとしたときに、その指定したパッケージに前提となる依存関係のあるパッケージが存在する場合は、デフォルトでは依存関係のあるパッケージも合わせてPyPIからダウンロード/インストールしてくれます。
Pythonは、さまざまなプラットフォーム(OS, CPUアーキテクチャー)で広くサポートされる言語環境です。パッケージによっては、OSやCPUアーキテクチャー、Pythonのバージョン等に依存するものもあります。そのため、そのパッケージがどのPythonバージョンやプラットフォームと互換性があるのか、というのを管理するために、whlファイルのネーミング・ルールが決まっています。
whlファイルのフォーマットは以下のようになっています。
{distribution}-{version}-{python_tag}-{abi_tag}-{platform_tag}.whl
- python_tag: pythonバージョンの互換性 (言語レベルの互換性)
- abi_tag: python application binary interfaceの互換性 (コンパイルされたバイナリレベルの互換性)
- platform_tag: OS, CPUアーキテクチャ
例えば、PyYAMLというパッケージが提供しているwhlファイルを見てみると...
このパッケージはPythonバージョンやプラットフォームに依存するようなので、Pythonバージョンやプラットフォームごとに個別のwhlファイルが提供されていることがわかります。
一方で、pysocksというパッケージが提供しているwhlファイルを見てみると...
PySocks-1.7.1-py3-none-any.whl というように、platform_tagがanyになっているため、OSやCPUアーキテクチャーには依存しないモジュールであることが分かります。
pip installコマンドでは、コマンドを実行したプラットフォームに合ったwhlファイルを自動的に判別してダウンロードし、インストールしてくれます。広く使われているパッケージは、たいていWindows, Mac, Linuxあたりはサポートされるので、あまりプラットフォーム依存の情報を意識しなくても問題なく使えていることが多いと思います。
z/OSで利用可能なパッケージ
z/OS版のPythonは比較的新しいということと、メインフレームやz/OSというのがかなり特殊なプラットフォームであることから、PyPIで一般に公開されているパッケージは恐らくz/OSを意識していないものがほとんどだと思われます(一部z/OSプラットフォームを意識して作られているものもあります)。
先に示したように、プラットフォームに依存しない純粋にPython互換のモジュールもありますが、z/OS上での稼働が問題ないかどうかは若干あやしい気がします(OSSである以上そもそも稼働保証というものは無いのですが)。さらに、メインフレーム、z/OSは、主に金融系企業での基幹系システムで利用されることが多いプラットフォームですので、セキュリティ要件も非常に厳しい傾向にあります。
そのような背景もありIBMさんは、昨今注目されているAI関連、機械学習関連のパッケージについてz/OSのPythonで稼働が確認されたものを、"Python AI Toolkit for IBM z/OS" というツールとして提供してくれています。
参考:
Announcement Letter
Python AI Toolkit for IBM z/OS
Github - ibm-z-oss-oda / python_ai_toolkit_zos
RedPaper: Securely Leverage Open-Source Software with Python AI Toolkit for IBM z/OS
Python AI Toolkit for IBM z/OSで提供されるパッケージ群は、依存関係のツリーが完全に閉じた構造になっています(他のリポジトリから追加で依存関係のあるパッケージを入手する必要は無い)。そのため、ここで提供されるパッケージを利用する限りにおいては、既に検証が行われた安全なパッケージのみ利用されるということになります。
Python AI Toolkit for IBM z/OSのパッケージ群は、インターネット経由でアクセスできる独自のリポジトリ上に公開されており(PyPIとは別)、無償で利用が可能です(有償でのサポート契約も可)。
先に、Pythonのパッケージでプラットフォームに依存するものはそのためのタグ付けがされて管理されていることを紹介しました。ただし、残念ながら今のところ(2025年9月現在)、z/OSを示すplatform_tagは無さそうです(明確に決まっていない???)。s390xというplatform_tagが付いたパッケージを見かけることもありますが、これは恐らくzLinux用のパッケージだと思われます。Python AI Toolkit for IBM z/OSで提供されているパッケージのwhlファイルを見ると、全てabi_tagはnone、platform_tagはanyとなっています。
z/OS上でのPythonパッケージのインストール方法
Pythonスクリプトを開発する際は、その目的にもよりますがPython言語環境が標準で提供している機能だけでは不足する場合が多く、特に機械学習やAI関連の実装を行いたい場合はパッケージとして提供されている機能を追加インストールして利用することがほとんどだと思います。前述のように、オープン系プラットフォームで利用する場合には、インターネット接続ができる環境で利用することがほとんどだと思いますので、使いたいパッケージがあれば適宜pip installコマンドでPython仮想環境に追加インストールすればよいですが、z/OS環境ではなかなかそうもいきません。
ここでは、z/OSが直接インターネットにアクセスできない環境を前提に、Pythonパッケージをインストールする方法を挙げてみます。
(1)whlファイルを入手してインストール
とりあえず試すということであれば、恐らくこれが一番手っ取り早く実施できる方法だと思われます。
まず、インターネットに接続可能なPC上にPython環境を構築し、pipコマンドが実行できるようにしておきます。そこから、pip downloadコマンドを使用することで、PC上にwhlファイルをダウンロードすることができます。この時、オプションでplatformなどを明示指定することができます。
参考: pip download
ただし、上にも示したようにz/OSを示す明確なplatform_tagは無いので、abi_tag=none, platform_tag=any のものを指定して入手する、ということになります。
または、PyPI提供のパッケージについては、もう少しお手軽な方法としてはブラウザからPyPIのサイトにアクセスしてそこから目的のwhlファイルを選択してダウンロードする、という方法があります。
例えば、PyPIサイトで特定のパッケージを検索して表示すると、「ファイルをダウンロード」というリンクがあります。

ここから、必要なファイルを選択してダウンロードすることができます。

※Python AI Toolkit for IBM z/OSで提供されるリポジトリの場合、残念ながらブラウザからダウンロードするUIは提供されていないようです。
目的のwhlファイルが入手できたら、それをターゲットとなるz/OS環境にファイル転送します。ここで利用できる方法は環境に依存します。USSのファイルシステムに転送する必要がありますので、ftp、sftpあたりが使えるとよいです。
whlファイルがz/OS USS上に配置できたら、pip installコマンドでwhlファイルを指定してインストールすることができます。
参考: pip install
※これは個別に必要なwhlファイルを入手して転送する必要があるので、依存関係があるパッケージだと少し面倒です。依存関係の判断については後述します。
(2)Proxy経由でインストール
pipコマンドのオプションで --proxy を指定すると、proxy経由でPackage Repositoryにアクセスし、パッケージをインストールすることができるようになります。
参考: --proxyオプション
従って、インターネットアクセス可能なProxy Serverを立て、そこを経由するようにすればz/OS上にパッケージをインストールすることができるようになります。
socks5 proxy経由でパッケージをインストールする時のコマンド例
(venv_test01) [CICS004@EPLEX1:/u/cics004/Python] pip install --no-deps -r requirements.txt --proxy socks5://xx.xx.xx.xx:9901
補足:
socks5 proxyを用意した上で、上のようなコマンドを使用しproxy経由で実際にパッケージのインストールが行えることが確認できました。
ただし、socks5を使用するには、事前にPySocksというパッケージをインストールしておく必要がありました。なので、最初にこのパッケージだけは個別にwhlファイルを入手してインストールしておく必要がありました。
ちなみにPySockで提供されるwhlファイルは、PySocks-1.7.1-py3-none-any.whlというネーミングになっており(abi_tag=none, platform_tag=any)、プラットフォームには依存しないパッケージという位置づけになっています。実際z/OS環境で動かせました。
(3)ローカル・リポジトリ・サーバーを構築
pip installコマンドは、デフォルトではPyPIという公式のリポジトリを参照しにいきますが、--index-urlオプションを指定することで参照するリポジトリの宛先を明示指定することができます。
参考: pip install --index-urlオプション
実際に試してはいませんが、ローカルにPythonパッケージ管理用のリポジトリを構成して必要なパッケージを配置してあげれば、pip installでそこからインストールできるはずです。リポジトリとしては、Sonatype Nexsus RepositoryやJFrog Artifactoryなどのエンタープライズ向けツールが使えそうですし、Webサーバーを使った簡易的な構成などもできそうです。
Requirementsファイル指定によるインストール
pip installコマンドでパッケージをインストールする際、インストールしたいパッケージのリストをRequirementsファイルとよばれるファイルに用意しておき、それを指定してインストールする、という方法がよくとられます。
このRequirementsファイルには、パッケージのバージョンやハッシュ値、pip installオプションのコマンドなども含めることができます。
Python AI Toolkit for IBM z/OSで提供されるパッケージをインストールする際には、GitHub上で提供されるRequirementsファイルを利用することができます。
上のGitHubのフォルダには、PythonバージョンごとのRequirementsファイルが提供されています。ここで提供されるRequrementsファイルには、Python AI Toolkit for IBM z/OSで提供されているパッケージが全てリストされています。このrequirementsファイルをコピーし、インストールしたいパッケージのみを残して(他は削除)使用します。
ここにリストされている各パッケージにはハッシュ値が指定されています。ハッシュ値がチェックされることで、パッケージが改ざんされていないことを担保することになります。
また、Requirementsファイルには--index-url https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/simpleオプションが指定されています。これはIBMが提供するPython AI Toolkit for IBM z/OS 専用のパッケージリポジトリの宛先を示しており、すなわち、IBMがz/OS上での稼働を確認した安全なパッケージを取得できることを意味します。
Requirementsファイル指定でのpip installコマンド例:
pip install --no-deps -r <toolkit_requirements.txt>
依存関係の解決
PC上でPythonのパッケージを追加インストールする際は、通常、pip installで特定のパッケージ名を指定すればそのパッケージ、および、そのパッケージの稼働に必要な別のパッケージ、すなわち、依存関係のあるパッケージを芋づる式に判断して一緒にインストールしてくれます。
ですが、厳密性や安全性がより求められるメインフレーム環境では、事前に必要なパッケージを精査して計画的にインストールすることが求められることも多いでしょう。従って、特定のパッケージを利用しようとしたときに、その依存関係のあるパッケージを全て事前に精査する必要がありますが、Pythonパッケージ管理の仕組みとしては、事前に特定のパッケージと依存関係のあるパッケージをピックアップするためのスマートな仕組みは提供されていないようです。
インターネット接続可能なPCのPython環境で、実際にpip installコマンドを実行して依存関係をチェックするのが一番手っ取り早い方法だと思われます。
※ただし、この方法ではうまくいかない場合もあるようです(後述)。
依存関係調査~インストールまでの手順例
PC(Windows11)上で依存関係をチェックする手順を具体的に試してみます。
PC上には事前にPythonがインストールされている前提です。ここでは、Python AI Toolkit for IBM z/OSで提供される"Pandas"というパッケージを例に試してみます。
(1) 仮想環境を新規に作成
C:\y\VSCode_workspace\eplex_work3>py -3.12 -m venv venv312_zos01
C:\y\VSCode_workspace\eplex_work3>venv312_zos01\Scripts\activate
pipをUpgradeしておく
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3>pip list
Package Version
------- -------
pip 24.0
[notice] A new release of pip is available: 24.0 -> 25.2
[notice] To update, run: python.exe -m pip install --upgrade pip
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3>python.exe -m pip install --upgrade pip
Requirement already satisfied: pip in c:\y\vscode_workspace\eplex_work3\venv312_zos01\lib\site-packages (24.0)
Collecting pip
Using cached pip-25.2-py3-none-any.whl.metadata (4.7 kB)
Using cached pip-25.2-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 24.0
Uninstalling pip-24.0:
Successfully uninstalled pip-24.0
Successfully installed pip-25.2
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3>pip list
Package Version
------- -------
pip 25.2
(2) Requirementsファイルの入手
z/OS上のPython環境はV3.12を使用する想定なので、以下のV3.12用のRequirementsファイルをGitHubから入手
https://github.com/ibm-z-oss-oda/python_ai_toolkit_zos/blob/main/requirements/pyaitoolkit_cp312_1.1.6.post11.txt
(3) Requirementsファイルのカスタマイズ
入手したRequirementsファイルを以下のように編集して、パッケージとしてPandasのみを含むようにします。
#####
#
# Python AI Toolkit for IBM z/OS
#
# This is the complete list of packages that make up the Python AI
# Toolkit for IBM z/OS.
#
# Example use: pip install --no-deps -r <toolkit_requirements.txt>
#
# pip command options:
--index-url https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/simple
--trusted-host downloads.pyaitoolkit.ibm.net
# --require-hashes
--only-binary :all:
#
# This requirements file was generated for a cp312 environment.
#
pandas==2.3.0
※依存関係を自動で判別させる場合、ハッシュ値のチェックを有効化するとエラーになるので、--require-hashesオプションはコメントアウトし、pandasパッケージの後ろのハッシュ値も削除しておきます。
(4) 依存関係の確認
上のRequirementsファイルを使用してpip installコマンドを実行しますが、この時、--dry-run --ignore-installedオプションを指定すると、実際のインストールは行われず、依存関係のあるパッケージの検査のみ行うことができます。
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3\python_ai_toolkit>pip install --dry-run --ignore-installed -r requirements_test01.txt
adding trusted host: 'downloads.pyaitoolkit.ibm.net' (from line 12 of requirements_test01.txt)
Looking in indexes: https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/simple
Collecting pandas==2.3.0 (from -r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/pandas/2.3.0/pandas-2.3.0-cp312-none-any.whl (19.2 MB)
Collecting numpy>=1.26.0 (from pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/numpy/2.0.2/numpy-2.0.2-cp312-none-any.whl (10.1 MB)
Collecting python-dateutil>=2.8.2 (from pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/python-dateutil/2.8.2/python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting pytz>=2020.1 (from pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/pytz/2022.4/pytz-2022.4-py2.py3-none-any.whl (500 kB)
Collecting tzdata>=2022.7 (from pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/tzdata/2025.2/tzdata-2025.2-py2.py3-none-any.whl (358 kB)
Collecting defusedxml (from pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/defusedxml/0.7.1.post3/defusedxml-0.7.1.post3-py2.py3-none-any.whl (28 kB)
Collecting six>=1.5 (from python-dateutil>=2.8.2->pandas==2.3.0->-r requirements_test01.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/six/1.16.0/six-1.16.0-py3-none-any.whl (11 kB)
Would install defusedxml-0.7.1.post3 numpy-2.0.2 pandas-2.3.0 python-dateutil-2.8.2 pytz-2022.4 six-1.16.0 tzdata-2025.2
Collecting ... で示されるパッケージが前提として必要であることが分かります。
ちなみに、pip downloadコマンドを使用して、依存関係を自動判別させながらwhlファイルを一式ダウンロードすることもできます。ただし、依存関係を自動判別させてダウンロードする場合、ハッシュ値によるチェックは行えません。すなわち、ダウンロードしたパッケージが改ざんされているかどうかをチェックすることができません。
安全性のため、一度依存関係のあるパッケージを判別した後、それらのパッケージを含むハッシュ値付きのリストをRequirementsファイルとして再作成し、それを使用してパッケージのダウンロード/インストールを行うことをおすすめします。
(5) ダウンロード用Requirementsファイルの作成
依存関係のあるパッケージを含むRequirementsファイルを作成します。
#####
#
# Python AI Toolkit for IBM z/OS
#
# This is the complete list of packages that make up the Python AI
# Toolkit for IBM z/OS.
#
# Example use: pip install --no-deps -r <toolkit_requirements.txt>
#
# pip command options:
--index-url https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/simple
--trusted-host downloads.pyaitoolkit.ibm.net
--require-hashes
--only-binary :all:
#
# This requirements file was generated for a cp312 environment.
#
pandas==2.3.0 --hash=sha256:825b9664e8c621e3fb1e8413665767512bd3cfa69b8c4d1ae48ec7311a0e707f
defusedxml==0.7.1.post3 --hash=sha256:b9fcbc583c42560d13747fcff66a17e2360708e672618f2bb3a92881f26c1da9
numpy==2.0.2 --hash=sha256:d4cf3bde4f4f4873dbc62e11306a71fa033456624afeb636adf5b84af3d9da53
python-dateutil==2.8.2 --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
pytz==2022.4 --hash=sha256:6eb3220e93b321d88847ef5da93ac8036cca1ad821d3dc6e956139acc91c1264
six==1.16.0 --hash=sha256:31b9420324b64686ad1e85d1a981456eeca115dc8503e168ecae830f8f83d86e
tzdata==2025.2 --hash=sha256:24aeefdc298eec1c9b53848a20691f22aa0e9b247e54bbf6cddc509774c3dbc6
(6) PC上にwhlファイルをダウンロード
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3\python_ai_toolkit>pip download --no-deps -r requirements_test02.txt
adding trusted host: 'downloads.pyaitoolkit.ibm.net' (from line 12 of requirements_test02.txt)
Looking in indexes: https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/simple
Collecting pandas==2.3.0 (from -r requirements_test02.txt (line 20))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/pandas/2.3.0/pandas-2.3.0-cp312-none-any.whl (19.2 MB)
Collecting defusedxml==0.7.1.post3 (from -r requirements_test02.txt (line 21))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/defusedxml/0.7.1.post3/defusedxml-0.7.1.post3-py2.py3-none-any.whl (28 kB)
Collecting numpy==2.0.2 (from -r requirements_test02.txt (line 22))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/numpy/2.0.2/numpy-2.0.2-cp312-none-any.whl (10.1 MB)
Collecting python-dateutil==2.8.2 (from -r requirements_test02.txt (line 23))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/python-dateutil/2.8.2/python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting pytz==2022.4 (from -r requirements_test02.txt (line 24))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/pytz/2022.4/pytz-2022.4-py2.py3-none-any.whl (500 kB)
Collecting six==1.16.0 (from -r requirements_test02.txt (line 25))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/six/1.16.0/six-1.16.0-py3-none-any.whl (11 kB)
Collecting tzdata==2025.2 (from -r requirements_test02.txt (line 26))
Using cached https://downloads.pyaitoolkit.ibm.net/repository/python_ai_toolkit_zos/packages/tzdata/2025.2/tzdata-2025.2-py2.py3-none-any.whl (358 kB)
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\pandas-2.3.0-cp312-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\defusedxml-0.7.1.post3-py2.py3-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\numpy-2.0.2-cp312-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\python_dateutil-2.8.2-py2.py3-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\pytz-2022.4-py2.py3-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\six-1.16.0-py3-none-any.whl
Saved c:\y\vscode_workspace\eplex_work3\python_ai_toolkit\tzdata-2025.2-py2.py3-none-any.whl
Successfully downloaded pandas defusedxml numpy python-dateutil pytz six tzdata
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3\python_ai_toolkit>dir | findstr "whl"
2025/09/22 16:39 28,286 defusedxml-0.7.1.post3-py2.py3-none-any.whl
2025/09/22 16:39 10,135,495 numpy-2.0.2-cp312-none-any.whl
2025/09/22 16:39 19,162,606 pandas-2.3.0-cp312-none-any.whl
2025/09/22 16:39 247,702 python_dateutil-2.8.2-py2.py3-none-any.whl
2025/09/22 16:39 500,834 pytz-2022.4-py2.py3-none-any.whl
2025/09/22 16:39 11,071 six-1.16.0-py3-none-any.whl
2025/09/22 16:39 358,370 tzdata-2025.2-py2.py3-none-any.whl
(7) whlファイルをz/OS環境(USS)上に転送
具体的な方法は、環境に応じて適宜選択
※これ以降はUSS上での操作
(8) whlファイル確認
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # ls -la | grep whl
-rw-r--r-- 1 BPXROOT SYS1 28286 Sep 22 03:46 defusedxml-0.7.1.post3-py2.py3-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 10135495 Sep 22 03:46 numpy-2.0.2-cp312-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 19162606 Sep 22 03:46 pandas-2.3.0-cp312-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 247702 Sep 22 03:46 python_dateutil-2.8.2-py2.py3-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 500834 Sep 22 03:46 pytz-2022.4-py2.py3-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 11071 Sep 22 03:46 six-1.16.0-py3-none-any.whl
-rw-r--r-- 1 BPXROOT SYS1 358370 Sep 22 03:46 tzdata-2025.2-py2.py3-none-any.whl
(8) インストール用Requirementsファイル作成
上のwhlファイルをインストールするためのRequirementsファイルrequirements_test03.txt作成します。
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # ls -laT | grep requirements_test03.txt
t UTF-8 T=on -rw-r--r-- 1 BPXROOT SYS1 247 Sep 22 03:51 requirements_test03.txt
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # cat requirements_test03.txt
defusedxml-0.7.1.post3-py2.py3-none-any.whl
numpy-2.0.2-cp312-none-any.whl
pandas-2.3.0-cp312-none-any.whl
python_dateutil-2.8.2-py2.py3-none-any.whl
pytz-2022.4-py2.py3-none-any.whl
six-1.16.0-py3-none-any.whl
tzdata-2025.2-py2.py3-none-any.whl
(9) whlファイルをインストール
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # pip install --verbose --log inst_log.txt --no-deps -r requirements_test03.txt
Using pip 24.3.1 from /u/ibmuser/Python/venv_test01/lib/python3.12/site-packages/pip (python 3.12)
Processing ./defusedxml-0.7.1.post3-py2.py3-none-any.whl (from -r requirements_test03.txt (line 1))
Processing ./numpy-2.0.2-cp312-none-any.whl (from -r requirements_test03.txt (line 2))
Processing ./pandas-2.3.0-cp312-none-any.whl (from -r requirements_test03.txt (line 3))
Processing ./python_dateutil-2.8.2-py2.py3-none-any.whl (from -r requirements_test03.txt (line 4))
Processing ./pytz-2022.4-py2.py3-none-any.whl (from -r requirements_test03.txt (line 5))
Processing ./six-1.16.0-py3-none-any.whl (from -r requirements_test03.txt (line 6))
Processing ./tzdata-2025.2-py2.py3-none-any.whl (from -r requirements_test03.txt (line 7))
Installing collected packages: pytz, tzdata, six, python-dateutil, pandas, numpy, defusedxml
changing mode of /u/ibmuser/Python/venv_test01/bin/f2py to 755
changing mode of /u/ibmuser/Python/venv_test01/bin/numpy-config to 755
Successfully installed defusedxml-0.7.1.post3 numpy-2.0.2 pandas-2.3.0 python-dateutil-2.8.2 pytz-2022.4 six-1.16.0 tzdata-2025.2
[notice] A new release of pip is available: 24.3.1 -> 25.2
[notice] To update, run: pip install --upgrade pip
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # pip list
Package Version
--------------- -----------
defusedxml 0.7.1.post3
numpy 2.0.2
pandas 2.3.0
pip 24.3.1
python-dateutil 2.8.2
pytz 2022.4
six 1.16.0
tzdata 2025.2
(10) ログ確認
(venv_test01) IBMUSER:/u/ibmuser/Python/Packages # cat inst_log.txt
2025-09-22T03:55:17,050 Using pip 24.3.1 from /u/ibmuser/Python/venv_test01/lib/python3.12/site-packages/pip (python 3.12)
2025-09-22T03:55:17,084 Non-user install because user site-packages disabled
2025-09-22T03:55:17,232 Created temporary directory: /SYSTEM/tmp/pip-build-tracker-ckk8gtp2
2025-09-22T03:55:17,232 Initialized build tracking at /SYSTEM/tmp/pip-build-tracker-ckk8gtp2
2025-09-22T03:55:17,232 Created build tracker: /SYSTEM/tmp/pip-build-tracker-ckk8gtp2
2025-09-22T03:55:17,232 Entered build tracker: /SYSTEM/tmp/pip-build-tracker-ckk8gtp2
2025-09-22T03:55:17,232 Created temporary directory: /SYSTEM/tmp/pip-install-n3s5ge8d
2025-09-22T03:55:17,241 Created temporary directory: /SYSTEM/tmp/pip-ephem-wheel-cache-p7kkdvrd
2025-09-22T03:55:17,267 Processing ./defusedxml-0.7.1.post3-py2.py3-none-any.whl (from -r requirements_test03.txt (line 1))
2025-09-22T03:55:17,278 Processing ./numpy-2.0.2-cp312-none-any.whl (from -r requirements_test03.txt (line 2))
2025-09-22T03:55:17,368 Processing ./pandas-2.3.0-cp312-none-any.whl (from -r requirements_test03.txt (line 3))
2025-09-22T03:55:17,568 Processing ./python_dateutil-2.8.2-py2.py3-none-any.whl (from -r requirements_test03.txt (line 4))
2025-09-22T03:55:17,574 Processing ./pytz-2022.4-py2.py3-none-any.whl (from -r requirements_test03.txt (line 5))
2025-09-22T03:55:17,585 Processing ./six-1.16.0-py3-none-any.whl (from -r requirements_test03.txt (line 6))
2025-09-22T03:55:17,588 Processing ./tzdata-2025.2-py2.py3-none-any.whl (from -r requirements_test03.txt (line 7))
2025-09-22T03:55:17,606 Created temporary directory: /SYSTEM/tmp/pip-unpack-xl1i9gsu
2025-09-22T03:55:17,606 Installing collected packages: pytz, tzdata, six, python-dateutil, pandas, numpy, defusedxml
2025-09-22T03:55:49,950 changing mode of /u/ibmuser/Python/venv_test01/bin/f2py to 755
2025-09-22T03:55:49,953 changing mode of /u/ibmuser/Python/venv_test01/bin/numpy-config to 755
2025-09-22T03:55:50,145 Successfully installed defusedxml-0.7.1.post3 numpy-2.0.2 pandas-2.3.0 python-dateutil-2.8.2 pytz-2022.4 six-1.16.0 tzdata-2025.2
2025-09-22T03:55:50,214 Remote version of pip: 25.2
2025-09-22T03:55:50,214 Local version of pip: 24.3.1
2025-09-22T03:55:50,219 Was pip installed by pip? True
2025-09-22T03:55:50,219 WARNING: UpgradePrompt(old='24.3.1', new='25.2')
2025-09-22T03:55:50,223 Removed build tracker: '/SYSTEM/tmp/pip-build-tracker-ckk8gtp2'
注意!
恐らく、上のやり方で依存関係のチェックができるものが多いと思いますが、jupyterlabについて同じように依存関係の調査を行ってみると、(4) 依存関係の確認 の操作(pip install --dry-run --ignore-installed)で以下のようなエラーで失敗しました。
INFO: pip is looking at multiple versions of jupyter-server to determine which version is compatible with other requirements. This could take a while.
ERROR: Could not find a version that satisfies the requirement pywinpty; os_name == "nt" (from jupyter-server) (from versions: none)
ERROR: No matching distribution found for pywinpty; os_name == "nt"
実行しているのがWindowsプラットフォームなので、どうもそこに引きずられてWindows関連のパッケージを探しにいってしまってエラーになっているようです。z/OSでインストールする時はこのパッケージは不要なはずなので無視しても良さそうですが、途中で依存関係のチェックが止まってしまいます。
Requirementsファイルに以下のオプションを追加して、PyPIも参照できるようにしてあげると、エラーは回避できました。
--extra-index-url https://pypi.org/simple
しかし、依存関係のあるパッケージとして一部、platform tagとして"win_amd64"がついたwhlファイルが認識されていました。
例:
Using cached MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl (15 kB)
Using cached pywin32-311-cp312-cp312-win_amd64.whl (9.5 MB)
Using cached pywinpty-3.0.0-cp312-cp312-win_amd64.whl (2.1 MB)
Using cached PyYAML-6.0.2-cp312-cp312-win_amd64.whl (156 kB)
Using cached pyzmq-27.1.0-cp312-abi3-win_amd64.whl (619 kB)
Using cached charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl (107 kB)
Using cached rpds_py-0.27.1-cp312-cp312-win_amd64.whl (232 kB)
Using cached tornado-6.5.2-cp39-abi3-win_amd64.whl (445 kB)
Using cached argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl (31 kB)
Using cached cffi-2.0.0-cp312-cp312-win_amd64.whl (183 kB)
Downloading debugpy-1.8.17-cp312-cp312-win_amd64.whl (5.3 MB)
Downloading psutil-7.1.0-cp37-abi3-win_amd64.whl (247 kB)
実際にz/OS上にインストール際は、上のパッケージに相当するものをPython AI Toolkit for IBM z/OS上から探して、それをインストールする必要があると思われます。
このように、パッケージによっては別プラットフォームでの依存関係の調査が一筋縄ではいかない場合があるかもしれません。
正攻法?
上の手順例だと、どうしてもお試し環境のプラットフォーム前提での依存関係調査になってしまい、厳密な意味でz/OS上で稼働させる場合の依存関係の調査とは差分が出てしまう可能性があります。
一度パッケージをインストールすると、pip show <packagename> コマンドで、そのパッケージが直接必要とする他のパッケージをチェックすることができます。ですので、少々手間がかかりますが、インターネット接続可能なWindows PC上などで、以下のような手順で依存関係を確認するのが正攻法なのかもしれません。
- 目的のパッケージのwhlファイルをダウンロード
- whlファイルを
--no-depsオプション付きで単体インストール -
pip show <packagename>コマンドで依存関係のある他パッケージを確認 - 依存関係のある他パッケージについても依存関係がすべて解決されるまで上の調査を繰り返す
(venv312_zos01) C:\y\VSCode_workspace\eplex_work3\python_ai_toolkit>pip show pandas
Name: pandas
Version: 2.3.0
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page:
Author:
Author-email: The Pandas Development Team <pandas-dev@python.org>
License: BSD 3-Clause License
Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
All rights reserved.
Copyright (c) 2011-2023, Open source contributors.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Location: C:\y\VSCode_workspace\eplex_work3\venv312_win\Lib\site-packages
Requires: defusedxml, numpy, python-dateutil, pytz, tzdata
Required-by:
※Requires: ... で示されているパッケージが、Pandasパッケージの稼働に必要な他パッケージです
パッケージのインストール先(zFS)
パッケージをインストールすると、基本的にはインストールしたPython仮想環境のディレクトリ以下のlib/pythonxx/site-packages/以下に必要なファイルが展開されます。ですので、少なくとも仮想環境のディレクトリの単位ではファイルシステムは分割しておく方がよいでしょう。
例えば、上の例で示したPandasとその依存関係のあるパッケージをインストールした後の同ディレクトリの状況は以下のようになっています。
(venv_test01) IBMUSER:/u/ibmuser/Python/venv_test01/lib/python3.12/site-packages # ls -la
total 368
drwxr-xr-x 18 BPXROOT SYS1 8192 Sep 22 03:55 .
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 17 05:38 ..
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 __pycache__
drwxr-xr-x 6 BPXROOT SYS1 8192 Sep 22 03:55 dateutil
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 22 03:55 defusedxml
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 defusedxml-0.7.1.post3.dist-info
drwxr-xr-x 24 BPXROOT SYS1 8192 Sep 22 03:55 numpy
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 numpy-2.0.2.dist-info
drwxr-xr-x 16 BPXROOT SYS1 8192 Sep 22 03:55 pandas
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 22 03:55 pandas-2.3.0.dist-info
drwxr-xr-x 5 BPXROOT SYS1 8192 Sep 17 05:39 pip
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 17 05:39 pip-24.3.1.dist-info
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 python_dateutil-2.8.2.dist-info
drwxr-xr-x 4 BPXROOT SYS1 8192 Sep 22 03:55 pytz
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 pytz-2022.4.dist-info
drwxr-xr-x 2 BPXROOT SYS1 8192 Sep 22 03:55 six-1.16.0.dist-info
-rw------- 1 BPXROOT SYS1 34581 Sep 22 03:55 six.py
drwxr-xr-x 4 BPXROOT SYS1 8192 Sep 22 03:55 tzdata
drwxr-xr-x 3 BPXROOT SYS1 8192 Sep 22 03:55 tzdata-2025.2.dist-info
例えばPandasというパッケージに着目すると、pandas、および、pandas-2.3.0.dist-infoという2つのディレクトリが作成され、配下に各種ファイルが展開されます。前者はパッケージ本体のモジュール群、後者はパッケージに関するメタ情報が含まれるようです。
このように、パッケージをインストールすると基本的に仮想環境の下のディレクトリにファイルが展開されることになりますので、仮想環境の単位でファイルシステム(zFS)を管理することをおすすめします。
各パッケージをインストールした時に具体的にどのくらいのサイズが必要か、というこについても、残念ながらスマートに確認する方法が無さそうです。事前にサイズを見積もる必要がある場合は、一旦PC上の仮想環境にインストールしてみてサイズを確認するのがよいと思われます。


