17

私はGoプログラムを書いています。この Go プログラムから、別のファイルで定義された Python 関数を呼び出し、関数の戻り値を受け取って、Go プログラムの後続の処理で使用できるようにしたいと考えています。ただし、Go プログラムで返されたデータを取得するのに問題があります。以下は、私がうまくいくと思ったものの最小限の例ですが、どうやらそうではありません:

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

いくつかのメモ:

  • 関数を直接-c呼び出すことができるように、Python 呼び出しでフラグを使用しています。cat_strings他のPythonプログラムで使用されるユーティリティ関数でいっぱいのPythonファイルの一部であると仮定するcat_stringsと、なぜ私はビジネスを持っていないのですかif __name__ == __main__.
  • print a + bPython ファイルを(の代わりにreturn a + b)に変更したくありません。関数が、他の Python コードから呼び出せるユーティリティ関数のセットの一部であるという前述のポイントを参照してください。
  • 関数は架空のcat_stringsものであり、デモンストレーションを目的としています。実際の関数は、Go で単純に再実装したくないものです。Go から Python 関数を呼び出して戻り値を取得する方法に本当に興味があります。
4

1 に答える 1