提问人:Ralf_Reddings 提问时间:11/13/2023 更新时间:11/13/2023 访问量:47
Python 程序执行所有行,但不运行任何“子进程”。Popen()' 行
Python programme executes all lines but does not run any 'subprocess.Popen()' lines
问:
我有一个简单的Firefox插件,我正在用它来测试和发现Native Messaging的功能,这是我最近遇到的。
附加组件方面的工作方式与我预期的一样,没有任何问题,我正在为附加组件的 Python 方面而苦苦挣扎。
该插件的工作原理如下:
- 在浏览器上,访问页面 HTML 基础知识时
- 该插件将通过 stdin 将消息“ping”发送到本地系统上的 Python 脚本
- python 脚本应该将它通过 stdin 收到的消息回复给浏览器,并通过
subprocess.Popen()
果然,在我所有的测试中,在浏览器控制台上,我可以看到 Python 程序发回这样的回复。但是这条线根本没有被执行过。无论我把它放在 Python 脚本中的什么位置。subprocess.Popen(["explorer", "C:/Temp"])
如果我只使用以下代码创建一个单独的 Python 脚本,并通过双击资源管理器中的文件来运行它,它就可以工作了。将创建一个资源管理器窗口:
import subprocess
subprocess.Popen(["explorer", "C:/Temp"])
当然,我希望做的不仅仅是打开资源管理器窗口,这只是一个简单的例子。关键是出于某种原因,我的 Python 程序卡在 stdin 或其他地方。
我尝试将 Python 代码重组为简单的东西,并尝试“关闭”stdin 流,看看这是否有助于它继续执行剩余的行:
import sys
import json
import struct
import subprocess
rawLength = sys.stdin.buffer.read(4)
if len(rawLength) == 0:
sys.exit(0)
messageLength = struct.unpack('@I', rawLength)[0]
message = sys.stdin.buffer.read(messageLength).decode('utf-8')
sys.stdin.buffer.flush() #Try closing the stdin buffer
sys.stdin.buffer.close() #Try closing the stdin buffer
subprocess.Popen(["explorer", "C:/Temp"]) #Again not executed
同样的问题仍然存在,最后一行再次未执行。我是 Python、JavaScript 和附加组件开发的新手。我四处询问了这样一个新颖的边缘用例的任何调试工具,但遗憾的是我没有找到答案。python 程序不会生成自己的控制台窗口,因此很难判断执行卡在何处,例如print()
我确实在自己的python脚本文件中尝试了以下操作:
import sys
import json
import struct
import subprocess
rawLength = sys.stdin.buffer.read(4)
print(rawLength)
subprocess.Popen(["explorer", "C:/Temp"])
它将生成自己的控制台窗口,程序卡在并会保留在那里,即使我只提供一个字母并按 ,当我提供四个字母时,它就会继续,在 打开文件资源管理器。rawLength = sys.stdin.buffer.read(4)
enter
c:/Temp
上次我四处打听。我被告知这可能是正在发生的事情,我正在寻找一种方法来停止 stdin 流读取或关闭它,这就是我试图用 / 做的事情,但它没有帮助。flush()
close()
我是否尝试以正确的方式关闭 stdin 流?如果是这样,我成功了吗?如何确定?stdin 甚至是罪魁祸首吗?
我没有想法,任何帮助将不胜感激!
为了完整起见,我的附加组件只包含两个文件,a 和 a .manifest.json
background.file
Manifest.json文件:
{
"name": "test",
"manifest_version": 2,
"version": "1.0",
"browser_action": {"default_icon": "icons/message.svg"},
"browser_specific_settings": {"gecko": {"id": "[email protected]","strict_min_version": "50.0"}},
"background": {"scripts": ["background.js"]},
"permissions": ["tabs","activeTab", "webRequest", "<all_urls>", "nativeMessaging"]
}
Background.json文件:
browser.webRequest.onCompleted.addListener(sendNativeMsg, {urls:["https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/HTML_basics"]});
function onResponse(response) {console.log(`INCOMING MSG: ${response}`);}
function sendNativeMsg(activeTab) {
let thisMsg = "ping"
console.log(`OUTGOING MSG: "${thisMsg}"`);
let sending = browser.runtime.sendNativeMessage("test", thisMsg);
sending.then(onResponse);
}
Python 脚本的源代码如下,我从上面链接的 Native Messaging, MDN 页面获得:
import sys
import json
import struct
import subprocess
# Read a message from stdin and decode it.
def getMessage():
rawLength = sys.stdin.buffer.read(4)
if len(rawLength) == 0:
sys.exit(0)
messageLength = struct.unpack('@I', rawLength)[0]
message = sys.stdin.buffer.read(messageLength).decode('utf-8')
return json.loads(message)
# Encode a message for transmission,
def encodeMessage(messageContent):
encodedContent = json.dumps(messageContent, separators=(',', ':')).encode('utf-8')
encodedLength = struct.pack('@I', len(encodedContent))
return {'length': encodedLength, 'content': encodedContent}
# Send an encoded message to stdout
def sendMessage(encodedMessage):
sys.stdout.buffer.write(encodedMessage['length'])
sys.stdout.buffer.write(encodedMessage['content'])
sys.stdout.buffer.flush()
while True:
subprocess.Popen(["explorer", "C:/Temp"]) #This line is never executed. The lines after here are executed.
receivedMessage = getMessage()
if receivedMessage == "ping":
sendMessage(encodeMessage('stdin was "' + receivedMessage + '", Task is done'))
答: 暂无答案
评论
sys.stdout
sys.stderr
print
logging
.exe