Posted at

Python3 覚え書き: インタラクティブモードで pythonスクリプト (main) を実行するには?

More than 1 year has passed since last update.


はじめに

最近少しずつpythonを使って書くようにしています。

今回は、本当に覚え書き程度です。


やりたいこと

表題の通りです。


どうしてそうしたいの?

もう少し背景を説明しますと...。

最近は学習のため、ちょっとしたスクリプトでもクラスを作って処理を書くようにしています。

その分、確認のために細かい単位でメソッドを用意して、インタラクティブモードでメソッド単位での動作をチェックしながら、少しずつ書いています。

さて、最終的には、コマンドラインから python xxxx.py と実行する形になりますので、スクリプトに main()の処理を添えていきます。

せっかくなので、別にターミナルを開かなくとも、インタラクティブモード内でimportしたスクリプトmainが実行できないかしら?と考えました。


やってみる

以下、簡単ですが覚え書き。

まずはスクリプト。

hello.py という名前で保存してみます。


class Usausa:
def __init__(self, name):
self.name = name;

def greeting(self):
print("こんにちは、{name} です〜。呼んでくれてありがとう".format(name=self.name))

def greeting_with_real_name(self):
print("こんにちは!ほんとの名前は Usausa-{name}です!".format(name=self.name))

if __name__ == '__main__':
usa = Usausa('2号')
usa.greeting()
usa.greeting_with_real_name()


インタラクティブモードで呼んでみる

こちらを、インタラクティブモードで動かしてみます。


  • まずは、作成したhello.pyを読み込みます (from hello import Usausa)

  • Usausaクラスのインスタンスを作ります

  • インスタンスメソッドを実行します


PyDev console: starting.

Python 3.6.4 (default, Mar 22 2018, 14:05:57)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
>>> from hello import Usausa
>>> usa = Usausa('1号')
>>> usa.greeting()
こんにちは、1 です〜。呼んでくれてありがとう

>>> usa.greeting_with_real_name()
こんにちは!ほんとの名前は Usausa-1号です!

エディタからインタラクティブモード (python consoleなどという感じ)を呼び出し、このようにメソッド単位で呼び出したりデバッグしたりします。


subprocessモジュールを使ってみる

同じ内容を、main()として定義しているので、今度は表題のことを、subprocessモジュールを使ってやってみます。

結局、特に凝った方法ではなくてごめんなさい...


  • rubyだとsystemやIO.popenになります


subprocess モジュールは新しいプロセスの開始、入力/出力/エラーパイプの接続、リターンコードの取得を可能とします。このモジュールは以下の古いモジュールや関数を置き換えることを目的としています

(上記のpython documentから引用)


ということで実行。

subprocessでの実行結果(標準出力)を変数に入れたい場合は、communicate()を利用します。

まずは普通に実行。


>>> import subprocess
>>> subprocess.Popen("python hello.py",shell=True)
<subprocess.Popen object at 0x101a2eac8>

こんにちは、2 です〜。呼んでくれてありがとう
こんにちは!ほんとの名前は Usausa-2号です!

出力やエラーをいったん受け取りたい場合は PIPEを使い、communicate()で呼び出して格納します。


>>> value = subprocess.Popen("python hello.py",shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

>>> stdout_data, stderr_data = value.communicate()
>>> print(stdout_data.decode('utf-8'))
こんにちは、2 です〜。呼んでくれてありがとう
こんにちは!ほんとの名前は Usausa-2号です!

以上、またまた簡単な覚え書きでした。

popenについてももっとドキュメントを読むこと、それ以上にそもそものプロセスの実行の仕組みを、ちゃんと理解しないといけない、という課題が出てきましたので、引き続き頑張ります。

間違いや「こうした方法があるよ!」といったご指摘、コメントも頂けると幸いです。