趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

GitHub上の.pyファイルを直接インポート、実行する

スポンサーリンク

 

 

 

GitHub上の.pyファイルを直接インポートできると便利だなと思ったのでコードを書いてみました。

a



GitHub上の.pyファイルのインポート方法

基本的にはweb上の.pyファイルを直接インポートすることはできません。多分危険だからだと思います。

手順、ソースコードを以下に示しますが、以下のサイトの情報がほぼそのままで、最新の環境に合わせて修正しただけです。

blanktar.jp

手順は、

  1. GitHubソースコードを読み込む
  2. 一時ファイルを作成
  3. ソースコードを一時ファイルに書き込み
  4. 一時ファイルをインポート
  5. 一時ファイルを削除

です。

ソースコードは次のとおりです。汎用化のため、いくつかのオプションを付けています。

import os
import tempfile
import urllib.request

def moduleimporterOnGitHub(url, cache=False, tmpfilename=None):
    # read raw data(binary) On Github
    with urllib.request.urlopen(url) as f: l = f.read() #.decode(encoding)  

    # file open & write data
    if tmpfilename is None:
        with tempfile.NamedTemporaryFile(delete=False, suffix='.py', dir='.') as fp:
            fp.write(l)
        name = fp.name
    else:
        with open(tmpfilename, mode='wb') as f:
            f.write(l)
        name = tmpfilename
        
    # import 
    imp = __import__(os.path.basename(name)[:-3])
    
    # delete tmpfile
    if not cache : os.remove(name)
        
    return imp

上記を使って、GitHub上の以下のコードをインポート、実行してみます。

def message():
    print('Hello, world!')

https://raw.githubusercontent.com/computational-sediment-hyd/moduleimporterOnGitHub/main/tmp.py

結果は以下のとおりで上手くいくことが確認できます。

url = 'https://raw.githubusercontent.com/computational-sediment-hyd/moduleimporterOnGitHub/main/tmp.py'
m = moduleimporterOnGitHub(url, cache=False, tmpfilename=None)
m.message()

# Hello, world!

さらに、上記の関数moduleimporterOnGitHubをmoduleimporterOnGitHub.pyの外部ファイルとして作業ディレクトリに保存すると、以下のとおりにより汎用的な形式になります。

import moduleimporterOnGitHub as mod

url = 'https://raw.githubusercontent.com/computational-sediment-hyd/moduleimporterOnGitHub/main/tmp.py'
m = mod.moduleimporterOnGitHub(url, cache=False, tmpfilename=None)
m.message()

# Hello, world!

GitHubソースコードを管理している方には意外と役立つかと思います。

参考:GitHubの.pyのソースコードのurlの取得方法

ソースコードのページで「Raw」ボタンをクリックしたページのURLを取得する。

GitHub

github.com

参考サイト

blanktar.jp

hibiki-press.tech

docs.python.org