通过HTTPServer执行shell命令-命令仅在请求期间有效

时间:2019-11-16 16:47:53

标签: python

为什么subprocess.call("xdotool key XF86AudioPlay")中的do_GET只持续我的http请求期间?

我正在尝试通过http请求在本地计算机上播放/暂停Spotify。即。收到请求后,模拟按键。

当我按下localhost:8002时-音乐播放了大约200毫秒,但请求完成后,音乐就停止了。

import http.server
import socketserver
import subprocess

MYCMD = "xdotool key XF86AudioPlay"
PORT = 8002

class MyRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        # Send the html message
        subprocess.call(MYCMD, shell=True)
        self.wfile.write(b'works')

        return

Handler = MyRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

1 个答案:

答案 0 :(得分:0)

这确实没有道理。

通常subprocess.call()等待调用过程完成。

在您的示例中,

只是模拟在服务器的xwindows上按下一个键。 您可以模拟按下一个按键来切换音频的播放。

我期望的是,您将以某种方式执行两个http请求。 第一个开始音频,第二个停止音频。

这两个请求的执行时间可能会延迟20毫秒左右。

我建议在子流程调用之前添加以下行

with open("/tmp/mylogfile.log", "a") as fout:
    fout.write("call subprocess")

以及子流程调用后的以下两行。

with open("/tmp/mylogfile.log", "a") as fout:
    fout.write("called subprocess")

我很确定,您将看到两个而不是一个请求。