Golang中命令参数的实现与使用
Golang中命令参数的实现与使用 早上好,
我的Go程序允许您创建此命令来调用另一个Python程序。
该Python程序生成随机数据并启动一个机器学习聚类算法(kmeans)。
我的问题是如何在此命令中传递我随机生成的输入数据(数据集):
exec.Command("ipython", "-c", "import kmeans; model=kmeans.KMeans(K=5, max_iters=100, plot_steps=False);model.predict(data=data)")
此致。
2 回复
exec.Command 会正确地引用参数。以下代码有效:
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("python3.7", "-c", "print(\"foo\"); print(1 + 2)")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n", out.String())
}
输出:
"foo\n3\n"
更多关于Golang中命令参数的实现与使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中通过exec.Command传递数据给Python程序,可以通过标准输入(stdin)或命令行参数实现。以下是两种方法的示例:
方法1:通过标准输入传递数据(推荐)
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
// 准备要传递的数据
data := `[[1.2, 2.3, 3.4], [4.5, 5.6, 6.7], [7.8, 8.9, 9.0]]`
// 创建命令
cmd := exec.Command("ipython", "-c", `
import sys
import json
import kmeans
# 从标准输入读取数据
input_data = sys.stdin.read()
data = json.loads(input_data)
# 创建模型并进行预测
model = kmeans.KMeans(K=5, max_iters=100, plot_steps=False)
result = model.predict(data=data)
print(result)
`)
// 将数据写入命令的标准输入
cmd.Stdin = bytes.NewBufferString(data)
// 捕获输出
var out bytes.Buffer
cmd.Stdout = &out
// 执行命令
err := cmd.Run()
if err != nil {
fmt.Printf("执行错误: %v\n", err)
return
}
fmt.Printf("预测结果: %s\n", out.String())
}
方法2:通过命令行参数传递数据
package main
import (
"encoding/json"
"fmt"
"os/exec"
"strings"
)
func main() {
// 准备数据
data := [][]float64{
{1.2, 2.3, 3.4},
{4.5, 5.6, 6.7},
{7.8, 8.9, 9.0},
}
// 将数据转换为JSON字符串
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Printf("JSON编码错误: %v\n", err)
return
}
// 转义引号,避免命令行解析问题
escapedData := strings.ReplaceAll(string(jsonData), `"`, `\"`)
// 创建命令,通过命令行参数传递数据
cmd := exec.Command("ipython", "-c", fmt.Sprintf(`
import json
import kmeans
# 从命令行参数获取数据
import sys
if len(sys.argv) > 1:
data_str = sys.argv[1]
else:
data_str = sys.argv[0]
data = json.loads(data_str)
# 创建模型并进行预测
model = kmeans.KMeans(K=5, max_iters=100, plot_steps=False)
result = model.predict(data=data)
print(json.dumps(result))
`, escapedData))
// 捕获输出
var out bytes.Buffer
cmd.Stdout = &out
// 执行命令
err = cmd.Run()
if err != nil {
fmt.Printf("执行错误: %v\n", err)
return
}
fmt.Printf("预测结果: %s\n", out.String())
}
方法3:通过环境变量传递数据
package main
import (
"encoding/json"
"fmt"
"os/exec"
)
func main() {
// 准备数据
data := map[string]interface{}{
"features": [][]float64{
{1.2, 2.3, 3.4},
{4.5, 5.6, 6.7},
},
"samples": 2,
}
// 将数据转换为JSON
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Printf("JSON编码错误: %v\n", err)
return
}
// 创建命令
cmd := exec.Command("ipython", "-c", `
import os
import json
import kmeans
# 从环境变量获取数据
data_str = os.environ.get("ML_DATA", "[]")
data = json.loads(data_str)
# 创建模型并进行预测
model = kmeans.KMeans(K=5, max_iters=100, plot_steps=False)
result = model.predict(data=data["features"])
print(json.dumps({"predictions": result, "samples": data["samples"]}))
`)
// 设置环境变量
cmd.Env = append(os.Environ(), "ML_DATA="+string(jsonData))
// 捕获输出
var out bytes.Buffer
cmd.Stdout = &out
// 执行命令
err = cmd.Run()
if err != nil {
fmt.Printf("执行错误: %v\n", err)
return
}
fmt.Printf("预测结果: %s\n", out.String())
}
方法4:通过临时文件传递数据(适合大数据集)
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
)
func main() {
// 准备大数据集
data := make([][]float64, 1000)
for i := range data {
data[i] = []float64{float64(i), float64(i * 2), float64(i * 3)}
}
// 创建临时文件
tmpfile, err := ioutil.TempFile("", "ml_data_*.json")
if err != nil {
fmt.Printf("创建临时文件错误: %v\n", err)
return
}
defer os.Remove(tmpfile.Name())
// 写入数据到临时文件
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Printf("JSON编码错误: %v\n", err)
return
}
if _, err := tmpfile.Write(jsonData); err != nil {
fmt.Printf("写入文件错误: %v\n", err)
return
}
tmpfile.Close()
// 创建命令,传递文件路径
cmd := exec.Command("ipython", "-c", fmt.Sprintf(`
import json
import kmeans
import os
# 从文件读取数据
file_path = r"%s"
with open(file_path, 'r') as f:
data = json.load(f)
# 创建模型并进行预测
model = kmeans.KMeans(K=5, max_iters=100, plot_steps=False)
result = model.predict(data=data)
# 清理临时文件
os.remove(file_path)
print(json.dumps({"predictions": result, "samples": len(data)}))
`, tmpfile.Name()))
// 捕获输出
var out bytes.Buffer
cmd.Stdout = &out
// 执行命令
err = cmd.Run()
if err != nil {
fmt.Printf("执行错误: %v\n", err)
return
}
fmt.Printf("预测结果: %s\n", out.String())
}
选择哪种方法取决于数据大小和具体需求:
- 小数据:使用方法1(标准输入)或方法2(命令行参数)
- 敏感数据:使用方法1(标准输入),避免在进程列表中可见
- 大数据:使用方法4(临时文件)
- 结构化数据:使用方法3(环境变量)适合配置信息

