Python调用os.system执行curl触发IFTTT webhook报unexpected EOF如何解决
问题根因
你遇到的报错是两层转义规则冲突导致的:
- 首先Python会先解析你写的字符串,吃掉一层转义符
- 字符串传给
os.system后,bash会再解析一次命令,而bash的单引号包裹的内容中,不支持转义单引号,你写的任何转义符在bash单引号里都会被当成普通字符处理,所以你试的两种转义写法都不生效。
最优解决方案:直接用Python发HTTP请求,绕开curl和bash转义坑
完全不需要调用系统curl命令,直接用Python的HTTP库发POST请求即可,不会有任何引号冲突问题:
import requests # 替换为你的IFTTT密钥 IFTTT_KEY = "<my_key>" url = f"https://maker.ifttt.com/trigger/notify_phone/with/key/{IFTTT_KEY}" data = { "value1": "I'm frustrated" } response = requests.post(url, json=data) # 可选打印响应结果验证 print(response.text)
如果不想安装第三方requests库,也可以用Python标准库urllib实现:
import urllib.request import json IFTTT_KEY = "<my_key>" url = f"https://maker.ifttt.com/trigger/notify_phone/with/key/{IFTTT_KEY}" data = json.dumps({"value1": "I'm frustrated"}).encode('utf-8') req = urllib.request.Request(url, data=data, headers={'Content-Type': 'application/json'}) with urllib.request.urlopen(req) as f: print(f.read().decode('utf-8'))
坚持使用curl调用的正确写法
要在bash单引号里插入单引号,需要用'\''的格式(先闭合当前单引号,插入一个转义后的单引号,再重新开启单引号),对应到Python字符串里的写法如下:
import os command = """curl -X POST -H "Content-Type: application/json" -d '{"value1":"I'\\''m frustrated"}' https://maker.ifttt.com/trigger/notify_phone/with/key/<my_key>""" os.system(command)
这种写法可读性很差、极易出错,不推荐使用。
内容的提问来源于stack exchange,提问作者Dakota Nickel
相关产品推荐
相关产品推荐

