私はGoプログラムを書いています。このGoプログラムから、別のファイルで定義されたPython関数を呼び出して関数の戻り値を受け取って、Goプログラムの後続処理で使用できるようにしたいと思います。私はGoプログラムで返されたデータを取り戻すことができません。以下は、私が仕事だろうと思ったものの最小の例であるが、どうやらない:GoからPython関数を呼び出して関数の戻り値を取得する
gofile.go
package main
import "os/exec"
import "fmt"
func main() {
fmt.Println("here we go...")
program := "python"
arg0 := "-c"
arg1 := fmt.Sprintf("'import pythonfile; print pythonfile.cat_strings(\"%s\", \"%s\")'", "foo", "bar")
cmd := exec.Command(program, arg0, arg1)
fmt.Println("command args:", cmd.Args)
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Println("Concatenation failed with error:", err.Error())
return
}
fmt.Println("concatentation length: ", len(out))
fmt.Println("concatenation: ", string(out))
fmt.Println("...done")
}
pythonfile.py
def cat_strings(a, b):
return a + b
私はgo run gofile
を呼び出す場合私は次の出力を得ます:
here we go...
command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")']
concatentation length: 0
concatenation:
...done
いくつかの注意事項:
- 私が直接機能
cat_strings
を呼び出すことができますので、私はPythonの呼び出しで-c
フラグを使用しています。cat_strings
は、他のPythonプログラムで使用されているユーティリティ関数でいっぱいになっているPythonファイルの一部であると仮定して、なぜ私はif __name__ == __main__
ビジネスを持っていません。 - 私はPythonファイルを
print a + b
(return a + b
ではなく)に変更したくありません。関数が他のPythonコードで呼び出し可能でなければならない一連のユーティリティ関数の一部であることについての先の点を参照してください。 cat_strings
機能は架空のものであり、デモンストレーションの目的で使用されます。実際の関数は、単にGoで再実装したくないものです。私はGoからPython関数を呼び出すことができ、戻り値を得る方法に本当に興味があります。
私はこれが 'os/exec'を使って簡単に行えないと感じています。すべての 'os/exec'関数は、stdoutおよび/またはstderrのみを返します。 – Intermernet
https://github.com/sbinet/go-pythonとhttp://stackoverflow.com/questions/12443203/writing-a-python-extension-in-go-golang – Intermernet
@Intermernet私は私のことを考えました'python -c 'の' print'を呼び出します。pythonfileをインポートします。 print pythonfile.cat_strings( "foo"、 "bar") ''はstdoutに出力されます。 –