こんにちは。
現役エンジニアの”はやぶさ”@Cpp_Learningです。
PythonとC/C++を連携したい!と思い”Python C API”に関する記事を書きました↓
”Python C API”は使いこなせれば、強力な武器になります!
しかし、参照カウントなどの注意点があり、使うときに少し身構えてしまいます。
あまり処理速度を気にしないから、もっと気軽にPythonからC/C++を使いたい!
という日もあるので、標準入出力を使って手軽にPythonと他言語を連携する方法を考えました。
Contents
標準入力・標準出力
例えば、標準入出力で”2 + 3 = 5”を演算する流れを図解で説明します↓
コマンドラインに数値やコマンドを入力し、ファイルを操作することを「標準入力」と言います。
↑の例ではキーボードを使って標準入力をしています。
ファイルが処理結果などをコマンドラインに出力(表示)することを「標準出力」と言います。
↑の例ではファイルが2, 3を受け取り、演算結果を標準出力しています。
つまり、標準入出力とはコマンドライン経由で任意のファイルとやり取りすることです。
- 標準入力:コマンドライン経由でファイルを操作すること
- 標準出力:ファイルが処理結果などをコマンドラインに出力すること
標準入出力による連携
次に標準入出力により、PythonとC/C++を連携する流れを図解で説明します。
先ほどユーザーがキーボードから標準入力をしていた部分をPythonに置き換えます!
以上!
ユーザーがインターフェースで操作していた部分をPythonのソースファイルに置き換えれば、コマンドライン経由でC/C++ソースファイルと連携できます。
【実践】標準入出力によるPythonとC++の連携
最初に実施手順を説明しておきます。
【標準入出力によるPythonとC++の連携手順】
- C++にさせたい処理(c = a + b)のソースコードを作成※
- キーボードによる標準入力でC++ソースコードの動作確認
- キーボードによる標準入力をPythonに置き換えるソースコードを作成
- PythonとC++連携の動作確認
※a, bの値は標準入力で渡します
つまり、下図の上段⇒下段の順に動作確認します。
標準入力された値の演算結果を標準出力するC++コード作成
標準入力された値の演算結果を標準出力するC++ソースコードを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> // Pure C/C++ function 'add' double add(double a, double b) { return a + b; } int main(int argc, char* argv[]) { double a, b, c; if (argc >= 3) { a = std::stod(argv[1]); b = std::stod(argv[2]); c = add(a, b); std::cout << c << std::endl; } return 0; } |
ポイントは以下の通りです。
キーボードによる標準入力でC++コードの動作確認
作成したC++ソースファイル(add.cpp)を以下のコマンドでコンパイルします。
g++ add.cpp
add.cppの保存先と同じ場所に”a.out”という実行ファイルが生成されます。
”a.out”以外の名前で実行ファイルを生成したい場合は、以下のコマンドを使います。
g++ -o myModule add.cpp
これで”myModule”という実行ファイルが生成されます。
(本記事では”a.out”を使います)
以下のコマンドで”a=2, b=3”のときの”c = a + b”を演算します。
./a.out 2 3
演算結果の”5”が出力(表示)されれば動作確認完了です。
一連の流れを実施したときのターミナル画面は以下の通りです。
キーボードによる標準入力をPythonコードに置き換え
さきほどはキーボードで以下のコマンドを入力しました。
./a.out 2 3
↑の処理をPythonにやらせます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import subprocess def main(): a = 2.2 b = 3.3 # call C/C++ executable file cmd = "./a.out " + str(a) + " " + str(b) c = subprocess.check_output(cmd.split()) # print(type(c)) # print(c.decode('sjis')) ans = float(c) + 1 print(ans) if __name__ == '__main__': main() |
ポイントは以下の通りです。
- str(a), str(b)で数値を文字列に変換
- ”./a.out 2 3”というコマンド(cmd)を作成
- subprocess.check_outputでコマンド(cmd)入力⇒演算結果取得
- 取得した演算結果は文字列なのでfloat(c)で数値に変換
- 演算結果cに+1する
PythonとC++連携の動作確認
作成したPythonコード(main.py)を以下のコマンドで実行します。
python main.py
C++の演算結果”5.5”に+1した”6.5”が出力(表示)されれば動作確認完了です。
一連の流れを実施したときのターミナル画面は以下の通りです。
実行環境
本記事で紹介したソースコードは以下の記事で紹介しているWSL(Windows Subsystem for Linux)で動作確認しました。
C++とPythonが動く環境ならWindows/Linuxどちらでも動きます
まとめ
標準入出力を使って手軽にPythonとC++を連携する方法を説明しました。
私がよく使うので、PythonとC++という組み合わせにしましたが、標準入出力が行えるプログラミング言語の組み合わせであれば、今回説明した方法で連携できます。
標準入出力を行う時間が気にならない場合にはオススメの連携方法です。
”あなた”の好きな2つのプログラミング言語を連携すれば、面白いことができるかも!
プログラミングを楽しんで下さいね!