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

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

ただいまの
回答率

87.58%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 516

score 30

やりたいこと

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

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

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

popen.py

import subprocess

print 'popen start'

cmd = 'python call.py'
proc = subprocess.Popen(cmd.split())
value = proc.communicate()
print value

print 'popen end'


call.py

import subprocess

print '!!! start'

cmd = './hello'
retcode = subprocess.check_call(cmd)


print '!!! end'


hello.cpp

#include <iostream>

using namespace std;

int main(){
  cout << "Hello world." << endl;
  return 0;
}

環境

OS:ubuntu18.04
python:2.7
g++:7.5.0

変更点

call.py

import subprocess

print '!!! start'

cmd = './hello'
retcode = subprocess.check_output(cmd)
print(retcode)

print '!!! end'

出力

popen start
!!! start
Hello world.

!!! end
(None, None)
popen end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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/28 14:51

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

    キャンセル

-1

call.py

import subprocess

print '!!! start'

cmd = './hello'
res = subprocess.check_output(cmd)
print res

print '!!! end'


で多分OK

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/28 01:28

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

    キャンセル

  • 2021/04/28 01:37

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

    キャンセル

  • 2021/04/28 21:25

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

    キャンセル

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • pythonのプログラムからC++のプログラムを実行し、C++の出力をpythonのプログラムで取得したい。