請教各位大大,需求是javascript執行本地client端電腦的python檔,把執行後的值顯示在網頁的textbox裡面,我卡在怎麼把執行後的值顯示在網頁的 textbox裡面或者是 段落裡,附上我的程式碼與執行結果。
html:
script type="text/javascript"
var cc="C:/Python25/test.py";
function start(strPath){
var objShell = new ActiveXObject("wscript.shell");
objShell.Run(strPath) ;
//objShell = null;
}
var y=document.getElementById("demo");
y.innerHTML=start(cc);
script
body:
body
請輸入要執行的程式路徑:
p id="demo"> /p
input type="button" value="SHOW" onclick=""
body
python:
print('HI')
#import serial
#import sys
#ser = serial.Serial('COM1', 9600, timeout=0.5)
#ser.read(1) # 小括號內可以填入一次要讀取的byte數
#data=ser.readline() # 讀取一列資料直到換行符號
#print data
#ser.close()
python執行結果:
網頁執行結果:
以上
直接從 browser 執行呼叫可能沒辦法
可能啦
如果透過後端呼叫
就很簡單
後端用 nodejs 的話
可以用 child_process
呼叫
var exec = require("child_process").exec;
exec('test.py',function(error,stdout,stderr){
if(stdout.length >1){
return console.log(stdout);
} else {
console.log("you don\’t offer args");
}
if(error) {
console.info('stderr :', stderr);
}
});
我cmd 下node這段可以顯示出HI
但用瀏覽器執行這段還是無法
顯示 Uncaught ReferenceError: require is not defined
at test.js:1
我查了一下,瀏覽器不支援require()......
啊我就說後端了阿XD
簡單的說,你想要的是 https://webduino.io/ ,只是你要python版的。
目前python好像沒有整合得那麼好的套件。不過要做也很簡單。
用flask做伺服器,按鈕後執行你要的功能,然後傳回去就行。
不過要做到漂亮像是連續介接資料到網頁畫圖,這就要很多其他的知識了。
下面的是用你的code拼出來的虛擬碼,不會動我不負責,因為你本來的code看起來就不會動了。
from flask import Flask, escape, request
app = Flask(__name__)
html = """
<script type="text/javascript">
..... #你的前端JS不可能直接執行python
<script>
<body>
{}
<body>
"""
def clickAction():
ser = serial.Serial('COM1', 9600, timeout=0.5)
ser.read(1) # 小括號內可以填入一次要讀取的byte數
data=ser.readline() # 讀取一列資料直到換行符號
print(data)
ser.close()
return data
@app.route('/')
def hello():
data = clickAction()
return html.format(str(data))
分享一個土炮作法:
用HTA呼叫dos指令來執行python(cmd例 "Python D:\test.py")
以下是執行過程
(1)在桌面上建立一個文字檔,並將它命名為"SILLY.HTA",然後以notepad++(或其它純文字編輯軟體,勿使用記事本)開啟,貼入下列源碼並存檔關閉。
<HTA:APPLICATION>
<!DOCTYPE html>
<html><head><meta charset="UTF-8" />
<title>My Silly Application</title>
<style>
*,html,body{margin:0;padding:0;box-sizing:border-box;}
h3{font-size:1.6em;padding:20px 0x;text-align:center;background:#666;color:#FFF;height:90px;}
.controls{height:50px;padding:20px 0px;text-align:center;font-size:1.2em;}
.controls input,.controls button{font-size:1.2em;height:1.5em;}
textarea{font-size:1.5em;width:100%;height:150px;border:solid 5px #666;}
</style>
</head>
<body>
<div><h3>用HTA(javascript) 呼叫DOS命令執行.py </h3></div>
<div class="controls">
<label for="py_path">Python檔案路徑</label><input type="file" id="py_path" value="" />
<button onclick="execPy()">RUN</button>
</div>
<textarea accesskey="k"></textarea>
<script language="javascript">
window.resizeTo(640, 380);
function execPy(){
var py_path=document.getElementById('py_path').value;
if(py_path.search(".py")!==-1){
shell = new ActiveXObject ("Shell.Application");
x='Python '+py_path;
shell.ShellExecute("cmd.exe", "/k " + x, "", "open", 1);
}else{
alert('尚未選取文件 或 選取的文件不是python檔!\n\n請重新選取...');
}
}
</script>
</body>
</html>
</HTA>
(2)在桌面建立一個文字檔並命名為 "silly_test.py" 以notepad++(或其它純文字編輯軟體,勿使用記事本)開啟,貼入下列源碼並存檔關閉。
import win32gui
import re,os
import pyautogui
class WindowMgr:
"""Encapsulates some calls to the winapi for window management"""
def __init__ (self):
"""Constructor"""
self._handle = None
def find_window(self, class_name, window_name=None):
"""find a window by its class_name"""
self._handle = win32gui.FindWindow(class_name, window_name)
def _window_enum_callback(self, hwnd, wildcard):
"""Pass to win32gui.EnumWindows() to check all the opened windows"""
if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None:
self._handle = hwnd
def find_window_wildcard(self, wildcard):
"""find a window whose title matches the wildcard regex"""
self._handle = None
win32gui.EnumWindows(self._window_enum_callback, wildcard)
def set_foreground(self):
"""put the window in the foreground"""
win32gui.SetForegroundWindow(self._handle)
output_str="Hello World!"
print(output_str)
w = WindowMgr()
#找到標題文字包含Silly的視窗,將它設為作用中視窗
w.find_window_wildcard(".*Silly*")
w.set_foreground()
pyautogui.keyDown('alt')
pyautogui.press('k')
pyautogui.keyUp('alt')
pyautogui.typewrite(output_str, interval=0.25)
#要讓 pyautogui輸入中文 請看這篇
#https://blog.csdn.net/ibiao/article/details/77859997
exit()
註: 請先確認 Python版本為3.7(或更新版本)
並已安裝 pywin32 與 PyAutoGUI 模組
(pip install pywin32)(pip install PyAutoGUI)
最好先在cmd模式底下確定silly_test.py能正常執行,就可以用HTA呼叫它測試了~
這裡我把範例上傳到網路上提供您參考。
http://www.web3d.url.tw/ITHELP/tmp/SILLY_HTA_RUN_PY.zip
當然最好還是用樓上邦友們建議的方式,我用的這個是非常古早的土炮方法,可當作考古題來看。