任務: 我正在嘗試在 python 中運行系統命令。該命令是 IFTTT 的網路鉤子,可向我的手機發送通知。我在這里關注了這篇文章。
我嘗試通過 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)
請注意我的 json 的“value1”是“我很沮喪”。I'm 中的單引號不被計算機欣賞,我不知道為什么。我遇到了以下錯誤:
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>"""
我究竟做錯了什么?
uj5u.com熱心網友回復:
我嘗試通過 bash 運行它,但在引數格式方面運氣不佳(我根本不知道 bash)。所以我使用python。
啊,但是您使用的是在子 shell 中運行的os.system,所以您仍在使用 shell,可能是 bash 或等效的。所以你沒有避免同樣的逃脫挑戰。
任務:我正在嘗試在 python 中運行系統命令。
看著您的問題,我認為您的實際任務是發出網路請求。
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 資料的 HTTP POST。如果您熟悉 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 中把它想象成一個“切換”;一個'禁用特殊字符,另一個'重新啟用它們。由于\將是短語中的特殊字符'\'',因此它不是有效的運算式。
彼得伍德說,
最好使用子行程構建命令,以便正確轉義/參考它們。
subprocess之所以作業如此之好,os.system是因為您可以在呼叫中將引數指定為單獨的值,因此您無需為 shell 本身轉義任何內容。事實上,您不需要 shell 來呼叫curl.
subprocess.run(["curl", "-X", "POST", ..., ... ], capture_output=True)
您的 POST 資料仍必須格式化為有效的 json:
... '-d', '{"value1":"I\'m frustrated"}'
Python 對'.
>>> 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 的輸出要容易得多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336372.html
