我的简单 python 程序不执行最后一行

My simple python program does not execute the last line

提问人:Ralf_Reddings 提问时间:11/11/2023 更新时间:11/11/2023 访问量:54

问:

我有一个简单的Firefox扩展,我已经大致弄清楚了Firefox方面的东西(JavaScript,DOM和启动Python程序)。

解释一切应该如何工作:

  1. 浏览器中发生事件
  2. Firefox 在本地系统上启动 Python 程序(通过 Native Messaging 实现)
  3. Firefox 通过 stdin 向 Python 程序传递一次性消息

在第 3 步之后,Firefox 将退出图片,而 Python 应该接管。

我被困在这个过程的 Python 部分。python 程序确实通过 stdin 从 Firefox 接收消息。但是一旦执行越过了界限,我就开始变得奇怪。例如,最后一行永远不会执行。即使我手动启动 Python 程序,比如在文件资源管理器中双击它,最后一行也永远不会执行。receivedMessage = getMessage()subprocess.Popen(...

使其执行的唯一方法是注释掉 .receivedMessage = getMessage()

import subprocess
import json
import struct
import sys

def getMessage():
    rawLength = sys.stdin.buffer.read(4)
    messageLength = struct.unpack('@I', rawLength)[0]
    message = sys.stdin.buffer.read(messageLength).decode('utf-8')
    return json.loads(message)

receivedMessage = getMessage()
#subprocess.Popen(["explorer", "C:/Temp"])            #Is never executed
subprocess.Popen(['pwsh', 'C:/Temp/testProg.ps1'])   #Is never executed

该程序的核心是我从 MDN 文档页面获得的一个示例,我通过删除冗余部分对其进行了重新设计。我不知道 stdin 背后的技术细节以及它是如何在 Python 中具体实现的,我只在高层次上理解它。

是什么阻碍了程序的执行?它会不会被Firefox仍然向它流式传输数据所阻碍?

任何帮助将不胜感激!

python firefox-addon stdin

评论

1赞 LhasaDad 11/11/2023
也许您获得的数据少于您尝试读取的数据,并且您在 read() 调用中被阻止。在带有 read(messageLength) 的行之前和之后放一条消息,看看你是否收到消息,一条消息或没有消息。
1赞 John Gordon 11/11/2023
是的,问题一定是其中一个调用没有足够的读取量,所以它只是永远等待。sys.stdin.buffer.read()
0赞 Ralf_Reddings 11/12/2023
@LhasaDad,有没有办法强制python程序显示控制台窗口进行调试?目前,我无法打印任何消息,因为我没有界面来阅读或观察它。我唯一的选择是将响应的功能带回浏览器控制台。我肯定知道它接收来自 std 的输入并在之后回复。
0赞 LhasaDad 11/13/2023
@Ralf_Reddings python 程序目前是如何启动的?您可能需要调出浏览器的 DevTools 并转到“控制台”选项卡,查看 Python 中的 Print 语句是否显示在那里。如果没有 Python 如何启动的背景,很难分辨。

答: 暂无答案