簡體   English   中英

使用參數從subprocess.call調用app

[英]Calling app from subprocess.call with arguments

我是Python的初學者,我一直在嘗試調用命令行應用程序,但它失敗了:

>>> import subprocess as s
>>> s.call("gpio -g read 17")
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.6/subprocess.py", line 470, in call
        return Popen(*popenargs, **kwargs).wait()
    File "/usr/lib/python2.6/subprocess.py", line 623, in __init__
        errread, errwrite)
    File "/usr/lib/python2.6/subprocess.py", line 1141, in _execute_child
        raise child_exception
OSError: [Errno 2] No such file or directory

但是如果我添加shell=True它就會開始工作。 有人可以解釋原因嗎?

>>> import subprocess as s
>>> s.call("gpio -g read 17", shell=True)
>>> 0

你沒有使用通話權。 查看文檔中的介紹或任何示例。 調用的第一個參數是“args”,一個參數序列,其中arg [0]是要運行的程序。

所以,當你這樣做時:

s.call("gpio -g read 17")

子進程可以通過兩種方式解釋這一點。 它應該運行一個名為“g”的程序,其參數為“p”,“i”,“o”,“”等。(記住,字符串是字符序列。)它可能會運行一個名為“gpio -g read”的程序17“沒有額外的論據。 無論哪種方式,它都不會找到這樣的程序。 (除非你碰巧在你的PATH上有一個名為“g”或“gpio -g read 17”的程序,在這種情況下它會做錯事而不是給你一個錯誤......)

你想要的是:

s.call(["gpio", "-g", "read", "17"])

那么,如果你傳遞shell=True ,為什么會這樣呢? 因為整個字符串被傳遞給shell,然后shell自己解析命令行並用空格分隔。 這就像調用os.system("gpio -g read 17")

請注意,以上所有內容都有點過於簡單(它忽略了Windows,而shell解析實際上並不是“按空格分隔”等等),因此您應該實際閱讀文檔。 (另外,編寫subprocess文檔的人比我更好。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM