🈲

【非推奨】Rubicon-ObjC の手動インストール・インポート

2024/04/07に公開

🚸️ 利用上の注意 ⛔️

Rubicon-ObjC の取得

各々のやりやすい方法で、getしてきます。

GitHub

リポジトリのtop

下記のリリースページともに、ブラウザ上から.zip ファイルで取得可能です。

(私の場合は、WorkingCopyでcloneして取得しています)

最新リリースのリンク

v0.4.8 リリース版

(このバージョンのおかげで、気軽にPythonista3で開発ができる)

pip

pip install rubicon-objc

i(Pad)OS 上での調整

必要なデータの抜き取り

ちょっとだけフォルダ名やファイル内容を書き換えるので、特定のフォルダを抜き取ります。

rubicon-objc/src/rubicon

rubicon フォルダが必要なフォルダです。

参考

カレントディレクトリ一覧
rubicon-objc
├── .git
├── .git-blame-ignore-revs
├── .github
├── .gitignore
├── .pre-commit-config.yaml
├── .readthedocs.yml
├── CHANGELOG.rst
├── CONTRIBUTING.md
├── LICENSE
├── README.rst
├── changes
├── docs
├── pyproject.toml
├── src       👈 ここの中のフォルダ
├── tests
└── tox.ini

確認する環境により、ドットファイルが出ていない場合があります(問題ありません)

書き換え

以下の状態にしていきます。

完成形
pyrubicon             👈 `rubicon` を`pyrubicon` に書き換え
├── .gitkeep          👈 追加(お好みで)
└── objc    
    ├── __init__.py   👈 ファイル内1ヶ所変更
    ├── api.py
    ├── collections.py
    ├── ctypes_patch.py
    ├── eventloop.py
    ├── runtime.py
    └── types.py

フォルダ名

rubiconpyrubicon に書き換えをします。なお、py 以外でも問題ありません。
(特に)Pytoにて、事前に入っているrubicon モジュールと衝突を回避するための処置です。

rubicon○○ やら○○Rubicon でもよかったのですが、コード上でpyrubicon <-> rubicon の書き換えの手間を考慮すると、先頭側にあって、ただ消すだけでよい。という理由から採用をしています。

ファイル内変更

__init__.py の内部を書き換えます。ファイル格納先は:

rubicon/objc/__init__.py

以下、変更内容です。

先頭行から表示
try:
    # Read version from SCM metadata
    # This will only exist in a development environment
    from setuptools_scm import get_version

    # Excluded from coverage because a pure test environment (such as the one
    # used by tox in CI) won't have setuptools_scm
    __version__ = get_version("../../..", relative_to=__file__)  # pragma: no cover
except (ModuleNotFoundError, LookupError):
    # If setuptools_scm isn't in the environment, the call to import will fail.
    # If it *is* in the environment, but the code isn't a git checkout (e.g.,
    # it's been pip installed non-editable) the call to get_version() will fail.
    # If either of these occurs, read version from the installer metadata.

    # importlib.metadata.version was added in Python 3.8
    try:
        from importlib.metadata import version
    except ModuleNotFoundError:
        from importlib_metadata import version

+   __version__ = None #version("rubicon-objc")
-   __version__ = version("rubicon-objc")

変数__version__ には、rubicon-OjbCのバージョンが入ります。が、手動での導入の関係で参照先にバージョン情報がないのでNone としておきます。

私は、1行分の処理の方が楽ですので、このようにしています。

tryexcept 自体が無駄。と感じる方は、先頭行から__version__ 定義直前までゴリっとコメントアウトしてもよいです。その際には、インデントを下げるのを忘れないように。

(追加: お好みで)

カレントディレクトリ直下に、.gitkeep として、中身が空のファイルを追加しています。WorkingCopyを使う時の空フォルダ扱い対策として使っています。

モジュールの設置場所

階層と実行

基本的に、実行ファイルと同階層にpyrubicon フォルダを配置します。

プロジェクトフォルダ
├── main.py     👈 実行するファイル
├── util.py     👈 `pyrubicon(rubicon)` を使った自作モジュールなど
└── pyrubicon
    ├── .gitkeep
    └── objc
        ├── __init__.py
        ├── api.py
        ├── collections.py
        ├── ctypes_patch.py
        ├── eventloop.py
        ├── runtime.py
        └── types.py

このような配置にすることで、rubiconでのサンプルコードもimport 文を少し変えるだけで実行ができます。

Your first bridge - Rubicon 0.4.8

チュートリアルのサンプルコード
#from rubicon.objc import ObjCClass
from pyrubicon.objc import ObjCClass    # 👈 `py` を追加するだけ

NSURL = ObjCClass("NSURL")

import の読み込み関係については、以下がわかりやすいかもです。

なおsys.path.append('..') を使った、力技のモジュールインポート方法もありますがお好みで…。

ポータビリティ環境

プロジェクトフォルダ 設定を終えれば、使いたいアプリケーション上でフォルダ参照をして———— といった取り回しやすい環境が構築できます。
Rubicon-ObjC自体が外部モジュールへの依存がとても低いのでこのような環境が作れるのですね。

PC環境では、決して好ましいとはいえない、インストール・インポート・環境設定ですので、冒頭で提示した内容を再度掲示して終わりにします。

ありがとうございました。

🚸️ 利用上の注意 ⛔️

Discussion