我想知道如何使用python脚本与金牛座的应用程序,我尝试了一些事情,但失败了我尝试使用HTML标签从用户输入,然后想把它传递给python,然后在python代码添加后想要在HTML页面中显示结果,我很困惑如何沟通他们两个(python和javascript)我将python脚本保存在与HTML相同的目录中,但当我单击按钮时,没有响应,
这是我的python脚本
num1 = int(sys.argv[1])
num2 = int(sys.argv[2])
result = num1 + num2
print(str(result))
这是HTML部分
<html>
<head>
<meta charset="UTF-8">
<title>My Tauri App</title>
</head>
<body>
<label for="num1">Enter number 1:</label>
<input type="number" id="num1">
<label for="num2">Enter number 2:</label>
<input type="number" id="num2">
<button id="addBtn">Add Numbers</button>
<div id="result"></div>
<script>
const { spawn } = require('child_process');
const addBtn = document.getElementById('addBtn');
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const resultDiv = document.getElementById('result');
addBtn.addEventListener('click', () => {
const num1 = parseInt(num1Input.value);
const num2 = parseInt(num2Input.value);
const python = spawn('python', ['add_numbers.py', num1.toString(), num2.toString()]);
python.stdout.on('data', data => {
const result = data.toString().trim();
resultDiv.textContent = `Result: ${result}`;
});
python.stderr.on('data', error => {
console.error(error.toString());
});
});
</script>
</body>
</html>
我将python脚本保存在与HTML相同的目录中,但当我单击按钮时没有响应,
我正在构建一个应用程序利用金牛座,Python和React。您可以将python实例作为"sidecar"这是他们在金牛座平台上的称呼
Tauri提供了几种牛头侧车之间的通信方式&tauri-react前端。
你可以在这里找到关于嵌入二进制文件作为金牛座应用程序的辅助工具的文档;https://tauri.app/v1/guides/building/sidecar/
使用PyInstaller将python脚本构建为独立可执行文件后,您可以将其放在项目文件夹中,然后将其初始化为sidecar可执行文件。
一旦你启动侧车;在最简单的情况下,您可以从tauri应用程序中侦听python可执行文件的stdout。
let (mut rx, mut child) = Command::new_sidecar("pythonexecutablename")
.expect("failed to create `pythonexecutablename` binary command")
.spawn()
.expect("Failed to spawn sidecar");
tauri::async_runtime::spawn(async move {
let main_window = app.get_window("main").unwrap();
while let Some(event) = rx.recv().await {
if let CommandEvent::Stdout(line) = event {
println!("Output from sidecar command: {}", line);
if line.contains("MESSAGE:STARTED") {
main_window
.emit("sidecar-ready", Some(()))
.expect("failed to emit event");
}
main_window
.emit("message", Some(format!("'{}'", line)))
.expect("failed to emit event");
child.write("message from Rustn".as_bytes()).unwrap();
}
}
});
以类似的方式,你也可以在React应用和Tauri应用之间进行通信。
import { emit, listen } from "@tauri-apps/api/event";
import { invoke } from "@tauri-apps/api/tauri";
invoke("is_app_ready").then((message) => {
console.log("RN - tauri app responded : ", message);
if (message === true) {
// Call listenUp when sidecar is ready
initiateListening();
} else {
const handler = listen("sidecar-ready", (event) => {
initiateListening();
});
}
});
我个人不会严重依赖于由金牛API提供的专用通信接口,因为你永远不知道什么时候你可能会切换你的UI层,或者为后端提供另一个用户界面,所以一旦我完成初始化和初始握手,我就启动一个SSE端点(服务器端发送的事件)直接到python后端。然后从react应用程序中收听。
免责声明
你所要求的,可以实现,但我将假设你是一个初学者开发,因为你想使用python和HTML。
考虑到这一点,让我告诉你这是一个可怕的想法。
是的,这不是不可能的,但它没有真正的好处。
你应该在金牛座应用的前端部分使用JavaScript或TypeScript。
如果你继续阅读,那就意味着你仍然对使用python感兴趣。
有两种方法。
- 第一种方法是使用像PyScript这样的库在浏览器上本地运行python。 第二种方式有两个选择。
- 使用RustPython作为计算python代码的库,与tauri的Command API一起工作。
- 将python解释器与你的应用捆绑在一起,并使用tauri的Command API从Rust后端生成一子进程(你已经尝试从前端做的事情)
发表评论我不能强调这是一个多么糟糕的想法,python不是为web设计的,你已经有了一个伟大的语言作为你的后端…Rust.
当你发现自己处于一种没有事情如你所愿的状态时,你应该想想你想做的事情是否真的有意义。