python在运行os.system()时出现意外EOF



任务:我正试图在python中运行一个系统命令。该命令是IFTTT的一个webhook,用于向我的手机发送通知。我在这里关注了这篇文章。

我试着通过bash运行它,但在参数格式化方面运气不佳(我根本不知道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)

注意我的";值1";对于json;我很沮丧";。电脑不欣赏《我是》中的一句话,我也不明白为什么。我收到以下错误:

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

我也尝试了以下命令,但我收到了同样的错误,所以我真的很困惑。

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>"""

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>"""

我做错了什么?

我试着通过bash运行它,但在参数格式化方面运气不佳(我根本不知道bash)。所以我使用的是python。

啊,但您使用的是在子shell中运行的os.system,所以您仍然使用shell,可能是bash或等效的shell。所以你没有避免同样的逃跑挑战。

任务:我正试图在python中运行一个系统命令。

看看你的问题,我认为你的实际任务是提出web请求。

curl -X POST -H "Content-Type: application/json" -d '{"value1":"I'm frustrated"}' https://maker.ifttt.com/trigger/notify_phone/with/key/<my_key>

好吧,那么您正在对Json数据进行HTTPPOST。如果你对python很熟悉,为什么要调用另一个可执行文件来发出HTTP请求?请求是python中最常见的方法。

从该链接中的示例开始,类似

r = requests.post('https://maker.ifttt.com/trigger/notify_phone/with/key/<my_key>', data={'value1':'I'm frustrated'})

-H "Content-Type: application/json"

我相信当您将对象作为数据传递时,您将免费获得此功能。但是,用requests显式地设置它当然是可能的。

值得一提的是,您遇到的转义问题是bash语法的一个怪癖:'不会对单引号字符串中的单引号进行转义。把bash中的CCD_ 4想象成";toggle";;一个'禁用特殊字符,另一个'重新启用它们。由于是短语'''中的一个特殊字符,因此它不是一个有效的表达式。

彼得·伍德说,

最好使用子流程构建命令,以便正确地转义/引用它们。

子流程比os.system工作得更好的原因是,您可以在调用中将参数指定为单独的值,因此不需要为shell本身转义任何内容。事实上,你没有需要一个shell来调用CCD_ 10。

subprocess.run(["curl", "-X", "POST", ..., ... ], capture_output=True)

您的POST数据仍然需要格式化为有效的json:

... '-d', '{"value1":"I'm frustrated"}'

Python为'提供了合理、标准的引用esacping。

>>> print('I'm working')
I'm working

如果您真的想在bash shell中实现这一点,那么可以通过多种机制来实现。这里有一个:

curl -X POST -H "Content-Type: application/json" -d '{"value1":"I'''m frustrated"}' http://httpbin.org/post

但重申一下,只需使用python的请求即可。它将正确处理Json数据的编码,如果你关心web请求的返回,那么在请求中处理它将比处理curl的输出轻松很多。