這個問題在這里已經有了答案: 如何在管道中使用“subprocess”命令 (9 個回答) 3 天前關閉。
我無法對這個做出正面或反面。嘗試在 python 腳本中使用子行程通過iw. 終端命令作業正常:
root@123da06:/app# iw dev wlan0 link | grep signal | awk '{print $2}'
-62
但是嘗試在 python 中運行它時失敗:
root@123da06:/app# python3 sub.py
Traceback (most recent call last):
File "sub.py", line 2, in <module>
output_bytes = subprocess.check_output("iw dev wlan0 link | grep signal | awk '{print $2}'")
File "/usr/local/lib/python3.8/subprocess.py", line 411, in check_output
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
File "/usr/local/lib/python3.8/subprocess.py", line 489, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: "iw dev wlan0 link | grep signal | awk '{print $2}'"
腳本再簡單不過了:
import subprocess
output_bytes = subprocess.check_output("iw dev wlan0 link | grep signal | awk '{print $2}'")
output = output_bytes.decode("utf-8")
print(f'Signal: {output}')
我究竟做錯了什么?
uj5u.com熱心網友回復:
你在這里遇到的一件大事是這iw dev wlan0 link | grep signal | awk '{print $2}'不是一個程序。
它是三個行程,由管道連接:iw,其輸出通過管道傳輸到grep,其輸出通過管道傳輸到awk。
值得注意的是,當您運行此命令時創建這些管道的是 shell - bash,很可能 - 它是根據您傳遞給它的命令來這??樣做的。
然而,Python 的子行程命令希望您將可執行檔案的路徑作為第一個引數傳遞。然后,您可以傳遞其他字串以用作您正在運行的可執行檔案的引數。做事Python是這樣的話,會大致如下:subprocess.check_output("/usr/sbin/iw", "dev", "wlan0"...)。這就是 python 感到困惑的原因——你傳遞給它的大長字串不是檔案路徑。
但是,您可以告訴 python 您正在使用引數(布爾shell引數)向它傳遞一個很長的 shell 命令。
嘗試這個:
# note the "shell=True" bit
output_bytes = subprocess.check_output("iw dev wlan0 link | grep signal | awk '{print $2}'", shell=True)
你應該看到它成功了。Python 將接收您的命令并將其交給 shell,后者將正確執行它,而不是嘗試使用您傳遞給它的字串作為要運行的可執行檔案的檔案名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324291.html
上一篇:Chdir滯后殼
下一篇:從變數中洗掉斜杠
