ホームページ >バックエンド開発 >Golang >GolangでPythonを使う方法

GolangでPythonを使う方法

PHPz
PHPzオリジナル
2023-04-21 14:14:164031ブラウズ

Golang と Python は 2 つの非常に人気のあるプログラミング言語であり、どちらも幅広いアプリケーション シナリオを備えています。場合によっては、特定のタスクを一緒に完了するためにこれら 2 つの言語を使用する必要がある場合、Python を使用して Golang プログラミングを支援するにはどうすればよいでしょうか?この記事では、Golang が Python をどのように使用するかを詳しく説明します。

1. Golang プログラミングを支援するために Python を使用する必要があるのはなぜですか?

Golang 開発プロセスでは、データ分析や機械学習などの特定のタスクを処理するために Python を使用する必要がある場合があります。 、および Web クローラー。お待ちください。これらのタスクは Golang でも実行できますが、これらの分野では Python の方が広く使用され、成熟しているため、Python を使用するとこれらのタスクをより速く、より便利に実行できます。

2. golang が Python プログラムを呼び出す方法

Golang では、os パッケージの Exec 関数を通じて Python プログラムを実行できます。サンプル コードは次のとおりです:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("python", "test.py", "arg1", "arg2")
    out, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(out))
}

上記のコードでは、exec パッケージの Command 関数を使用して、Python プログラムを実行するコマンドを作成します。このうち、最初のパラメータは実行するプログラムの名前、2番目のパラメータはプログラムに渡されるパラメータです。この例では、test.py プログラムを実行し、2 つのパラメーター arg1 と arg2 を渡します。

CombinedOutput メソッドを使用してコマンドを起動し、プログラムを実行します。戻り値はプログラムの出力結果と実行時のエラー メッセージです。エラーが発生した場合は、err 変数に値が割り当てられます。それ以外の場合は、out 変数にプログラムの出力が含まれます。

サンプルコードではPythonスクリプトtest.pyを使用していますが、次章以降でPythonプログラムの書き方を詳しく説明していきます。

3. Python が Golang と対話する方法

コマンド ラインを介して Python プログラムを実行することに加えて、Python の標準ライブラリを介して Golang と対話することもできます。 Python は、Python で Golang の C 言語インターフェイスを呼び出し、両者間の通信を実現するための ctypes や cffi などのいくつかのモジュールを提供します。

以下は、Python で Golang 関数を呼び出して結果を返す方法を示す簡単なサンプル コードです。

  1. Golang 関数を main.go ファイルに書き込みます
package main

import "C"

// 导出函数
//export SayHello
func SayHello(name *C.char) *C.char {
    return C.CString("Hello, " + C.GoString(name) + "!")
}

func main() {}

Golang では、文字列パラメーターを受け取り、文字列を返す SayHello 関数を定義します。この関数は、型変換に CGo 言語の C.CString 関数と C.GoString 関数を使用します。

  1. Golang 関数を呼び出すプログラムを Python で作成します
import ctypes

lib = ctypes.cdll.LoadLibrary('./main.so')

# 指定函数返回类型
lib.SayHello.argtypes = [ctypes.c_char_p]
lib.SayHello.restype = ctypes.c_char_p

# 调用函数
result = lib.SayHello(b'World')
print(result.decode())

Python では、ctypes モジュールを使用してコンパイルされた main.so ライブラリを読み込み、SayHello 関数のパラメーター タイプを指定しますそして戻り値の型。次に、この関数を呼び出して文字列パラメータ「World」を渡すと、出力結果は「Hello, World!」になります。

上記のコード例は、Python で Golang 関数を呼び出して結果を返す方法を示しています。

4. Python プログラムで Golang コードを使用する方法

Golang コードを Python プログラムで使用し、Golang プログラムの出力結果を取得することもできます。これを行うには、CGo 言語の C コード インターフェイスを使用して Golang 関数を C 関数にカプセル化し、Python の ctypes モジュールを通じて C 関数を呼び出す必要があります。

以下は、Python で Golang コードを使用する方法を示す簡単なコード例です。

  1. main.go ファイルで Golang 関数を定義します (前の例と同じ)
package main

import "C"

// 导出函数
//export SayHello
func SayHello(name *C.char) *C.char {
    return C.CString("Hello, " + C.GoString(name) + "!")
}

func main() {}
  1. main.h ファイルで Golang 関数を宣言します
#ifndef MAIN_H
#define MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

// 声明导出函数
char* SayHello(char*);

#ifdef __cplusplus
}
#endif

#endif

Python モジュールは Go 関数を直接参照できないため、 C インターフェイスを介して関数を実行します。

  1. Golang 関数の C インターフェイスを main.c ファイルに実装します
#include <stdlib.h>
#include "main.h"

// 使用import来导入Go包
#include "_cgo_export.h"

char* SayHello(char* name) {
    char* result = (char*)malloc(50 * sizeof(char));
    sprintf(result, "%s", SayHelloGo(name));
    return result;
}

C コードでは、SayHello 関数の C インターフェイスを実装します。 _Go_SayHello 関数が呼び出されます。この関数は CGo によって自動的に生成され、Go コードで直接 SayHello 関数を呼び出すことができます。ここで、CGo によって生成された関数の名前は、_Go_ に Go 関数の名前を加えたものであることに注意してください。

  1. 対応する .so ファイルをコンパイルして生成する

次のコマンドを実行して、対応する .so ファイルを生成します:

$ go build -o main.so -buildmode=c-shared main.go
  1. Python の場合カプセル化された C インターフェイスを呼び出す
import ctypes

lib = ctypes.cdll.LoadLibrary('./main.so')

# 指定函数返回类型
lib.SayHello.argtypes = [ctypes.c_char_p]
lib.SayHello.restype = ctypes.c_char_p

# 调用函数
result = lib.SayHello(b'World')
print(result.decode())

Python では、ctypes モジュールを使用して、C インターフェイスでカプセル化された .so ライブラリを読み込み、SayHello 関数のパラメーターの型と戻り値の型を指定します。次に、この関数を呼び出して文字列パラメータ「World」を渡すと、出力結果は「Hello, World!」になります。

上記のコード例は、Python で Golang コードを使用する方法を示しています。

まとめ: 以上が golang で Python を使用するための方法と手順であり、これらのスキルを習得することで、複雑なデータ処理、Web クローラー、機械学習などのタスクを迅速に完了し、開発効率を向上させることができます。

以上がGolangでPythonを使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。