2

コンパイルされたファイルを Mac で実行しても出力が得られないようですが、何らかの理由で Wi​​ndows では動作します。

test.cpp

#include<iostream>
using namespace std;
int main()
{
    cout << "Hello world" << endl;
    return 0;
}

パイソン

p = subprocess.Popen([r"/usr/bin/g++", "-Wall", "-o", "test", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()

空の出力を返すだけです:

(b'', b'')

Mac で実行するために何か追加する必要がありますか?

4

2 に答える 2

2

コンパイルはうまくいきました。コードに問題はなかったため、出力はありません。

('', '')

POSIX システム、Mac を使用しているため、生成されたバイナリ ファイルの前に「./」を指定せずにバイナリを実行しようとしましたtest。したがって、コマンドは次のようになります。

p = subprocess.Popen(["./test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#                      ^^
p.communicate()

これにより、次のことが得られます。

('Hello world\n', '')

予想通り。

$PATH注意すべきもう 1 つの点は、バイナリの場所をシェル変数に追加した場合は、./test. ただし、バイナリが にないため$PATH、シェルは実行可能ファイルを見つけることができませんでした。そのため、バイナリの場所を指定する必要がありました**スクリプトの実行ディレクトリに相対的です。

ただし、クロスプラットフォーム開発 (つまり、Windows のサポートを含む) のためにこれを行っている場合、そのアプローチは機能しません -あなたのアプローチは機能します - つまり、バイナリ名だけを使用しますが、パスを変更する必要があります。コンパイラがインストールされている場所。Cygwin を使用している場合は、上記のアプローチも機能します。Mingw または VS の場合、次の例のように、実行可能ファイル名だけで十分です。

p = subprocess.Popen(["C:\\gcc\\bin\\g++.exe", "-Wall", "-o", "test.exe", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["test.exe"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#                    
p.communicate()

参照:

WindowsでのPythonサブプロセス出力?

于 2013-08-11T12:22:47.437 に答える
1

Mac およびその他の UNIX ベースのオペレーティング システムでは、ファイルを実行するには、ファイル名の前に./.

したがって、という名前のファイルを実行するには、次のtestように言う必要があります。./test

この知識を使用して、コードを次のように変更する必要があります。

p = subprocess.Popen([r"/usr/bin/g++", "-Wall", "-o", "test", 'test.cpp'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
p = subprocess.Popen(["./test"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
于 2013-08-11T12:48:15.980 に答える