【问题标题】:Python-Shell / Node JS output emptyPython-Shell / Node JS 输出为空
【发布时间】:2018-10-17 21:43:37
【问题描述】:

背景故事:我正在使用 Electron 创建一个应用程序,目前正在尝试在计算机锁定/解锁时运行一个功能。

经过多次反复试验,我终于设法让以下 python 代码正常工作。当相关代码被触发时,代码会在屏幕上打印 Locked 或 Unlocked。我现在需要从 Node JS 运行 python 脚本,以便在事件触发时运行更多函数。

import win32con
import win32gui
import win32ts
import time

print("Test")

WM_WTSSESSION_CHANGE        = 0x2B1class WTSMonitor():
className = "WTSMonitor"
wndName = "WTS Event Monitor"

def __init__(self):
    wc = win32gui.WNDCLASS()
    wc.hInstance = hInst = win32gui.GetModuleHandle(None)
    wc.lpszClassName = self.className
    wc.lpfnWndProc = self.WndProc
    self.classAtom = win32gui.RegisterClass(wc)

    style = 0
    self.hWnd = win32gui.CreateWindow(self.classAtom, self.wndName,
        style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
        0, 0, hInst, None)
    win32gui.UpdateWindow(self.hWnd)
    win32ts.WTSRegisterSessionNotification(self.hWnd, win32ts.NOTIFY_FOR_ALL_SESSIONS)

def start(self):
    win32gui.PumpMessages()

def stop(self):
    win32gui.PostQuitMessage(0)

def WndProc(self, hWnd, message, wParam, lParam):
    if message == WM_WTSSESSION_CHANGE:
        self.OnSession(wParam, lParam)

def OnSession(self, event, sessionID):
    if event == 7:
        print("Locked")
    if event == 8:
        print("Unlocked")
    print(event)
    myststa(event)
WTSMonitor().start()

节点代码:

const { spawn } = require('child_process');
let py = spawn('python',['locked.py'])
py.stdout.on('data', data => console.log('data : ', data.toString()))
py.on('close', ()=>{
})

当我使用“Python locked.py”从控制台运行 python 时,我看到打印的测试消息。但是,当使用 node locked.js 运行时,脚本看起来像是在运行,但从不打印到控制台。

另外要提的是,如果我注释掉最后一行 WTSMonitor().start() 那么我可以看到测试消息打印到节点控制台。

【问题讨论】:

    标签: python node.js npm electron


    【解决方案1】:

    在进行实际故障排除之前,使用 python 调用 w32api 的主要原因是什么?首先你可以通过 electron / nodejs 本身来实现,而且 electron 会在 powerMonitor 中直接(https://github.com/electron/electron/blob/3a0640993ba9748ced9f9cd00de5dbfe7651f788/docs/api/power-monitor.md#event-lock-screen-macos-windows)有一个特定的事件,不一定需要 3rd 方代码。

    【讨论】:

    • 感谢您的回复 - 我在这里使用了主页上的文档:electronjs.org/docs/all#powermonitor,其中没有列出锁屏事件。我已经更新了 NPM 和 electron 并尝试在 app.on('ready') 函数中使用以下内容:electron.powerMonitor.on('suspend', () => { console.log('系统正在运行to sleep') }) 但是,它不会向控制台输出任何内容 :( 感谢您的回复!
    • 注意我提到了electron will have - 它没有公开当前的最新版本。
    猜你喜欢
    • 2022-01-19
    • 2020-08-20
    • 2018-07-16
    • 2021-08-03
    • 2021-12-03
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多