質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2272閲覧

pythonのプログラムからC++のプログラムを実行し、C++の出力をpythonのプログラムで取得したい。

man_

総合スコア45

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/04/27 07:39

編集2021/04/27 11:07

#やりたいこと
pythonのコードからC++のプログラムを子プロセスとして実行します。その後、C++のプログラムの出力をpythonコードで取得したいです。

具体的なコードを以下に示します。
ややこしいですが、popen.pyで、popenを使用しcall.pyを実行します。その後、call.pyでcheck_callを使用し、C++のhello.cppを実行します。
ここで、hello.cppで出力される"Hello world"という文字列をpopen.pyで取得する方法を教えていただきたいです。

少しややこしいですが、よろしくお願いします。

popen.py

python

1import subprocess 2 3print 'popen start' 4 5cmd = 'python call.py' 6proc = subprocess.Popen(cmd.split()) 7value = proc.communicate() 8print value 9 10print 'popen end'

call.py

python

1import subprocess 2 3print '!!! start' 4 5cmd = './hello' 6retcode = subprocess.check_call(cmd) 7 8 9print '!!! end'

hello.cpp

cpp

1#include <iostream> 2 3using namespace std; 4 5int main(){ 6 cout << "Hello world." << endl; 7 return 0; 8}

#環境
OS:ubuntu18.04
python:2.7
g++:7.5.0

#変更点
call.py

python

1import subprocess 2 3print '!!! start' 4 5cmd = './hello' 6retcode = subprocess.check_output(cmd) 7print(retcode) 8 9print '!!! end'

出力

popen start !!! start Hello world. !!! end (None, None) popen end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

変更点した後に対する回答になりますが

call.pyの
print '!!! start'とprint '!!! end'を無くせば
標準出力の結果がprint(retcode)だけになるので
その結果を受け取ればいいのではないでしょうか。

あとprint(retcode)では改行が付くので
sys.stdout.write(retcode)
に変更して

加えてpopen.pyの方も

proc = subprocess.Popen(cmd.split(),stdout=subprocess.PIPE)

とすればいいのではないでしょうか。

投稿2021/04/27 22:22

編集2021/04/27 22:36
xail2222

総合スコア1508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/04/28 05:51

変更したところ、実装することができました。 ややこしい質問でしたが、考えを汲み取っていただきありがとうございます。
guest

0

call.py

python

1import subprocess 2 3print '!!! start' 4 5cmd = './hello' 6res = subprocess.check_output(cmd) 7print res 8 9print '!!! end'

で多分OK

でも、popen.pyから直接hello.cppを呼び出したほうがいいと思いますよ。あとお節介だけども、Python2.7は今年の7月にサポートが切れるので3系を使いましょう。

投稿2021/04/27 08:08

rtgsdfsdg

総合スコア174

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/04/27 08:28

DaRuMaさん回答ありがとうございます。 開発環境の都合上、pepen.pyでC++の出力を取得したいです。 何か方法はありませんでしょうか?
rtgsdfsdg

2021/04/27 08:40

popen.pyの変数cmdの値を"./hello"にするといいです。
man_

2021/04/27 08:59

DaRuMaさん回答ありがとうございます。 popen.pyのcmdの値を"./hello"にするのではなく、"python call.py"のままで、間接的に出力を取得する方法を探しています。
rtgsdfsdg

2021/04/27 09:07

それなら既に回答した通りです。
man_

2021/04/27 11:09

回答ありがとうございます。 回答の通りに変更しましたが、popen.pyで"Hellow world"という出力を取得できていない状態です。 追記で、現在のpopen.pyの出力結果を載せました。
man_

2021/04/27 11:10

popen.pyのvalueという変数に"Hello world"を格納したいです。
rtgsdfsdg

2021/04/27 16:28

"!!! start"の次の行に"Hello world."と出力されているように見えますが...
man_

2021/04/27 16:37

"!!!start"の次の行で表示される"Hello world"はcall.py内のprintで表示されているものです。 そこで、popen.pyの中で"Hello world"という文字列を扱えるように、受け渡したいです。
rtgsdfsdg

2021/04/28 12:25

そしてそのcall.pyから出力されたhello worldはhello.cppから出力されたものですが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問