2012-08-03 29 views
9

Tôi là một người mới bắt đầu bằng Python, và tôi đã cố gắng để gọi một ứng dụng dòng lệnh, nhưng nó không thành công:Calling ứng dụng từ subprocess.call với đối số

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

Nhưng sau đó nếu tôi thêm shell=True nó tất cả bắt đầu hoạt động. Ai đó có thể giải thích lý do tại sao?

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

Trả lời

24

Bạn hiện không sử dụng quyền gọi. Hãy xem the introduction hoặc bất kỳ ví dụ nào trong tài liệu. Đối số đầu tiên của cuộc gọi là "args", một chuỗi các đối số, trong đó arg [0] là chương trình để chạy.

Vì vậy, khi bạn làm điều này:

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

Có hai cách trình con có thể giải thích điều này. Nó sẽ chạy một chương trình được gọi là "g" với các đối số "p", "i", "o", "", v.v. (Hãy nhớ rằng, chuỗi là chuỗi ký tự.) Thay vào đó, chương trình có thể chạy "gpio -g read 17 "không có đối số bổ sung. Dù bằng cách nào, nó sẽ không tìm thấy một chương trình như vậy. (Trừ khi bạn xảy ra để có một chương trình gọi là "g" hoặc "gpio -g đọc 17" trên PATH của bạn, trong trường hợp đó nó sẽ làm điều sai trái thay vì cho bạn một lỗi ...)

Những gì bạn muốn là :

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

Vì vậy, tại sao điều này hoạt động nếu bạn vượt qua shell=True? Bởi vì toàn bộ chuỗi này được truyền tới shell, sau đó thực hiện phân tích cú pháp của dòng lệnh và phân tách mọi thứ theo không gian. Nó giống như gọi số os.system("gpio -g read 17"). Xin lưu ý rằng tất cả những điều trên là một chút đơn giản (nó bỏ qua Windows và phân tích cú pháp vỏ không thực sự là "riêng biệt bởi dấu cách", v.v.), vì vậy bạn thực sự nên đọc tài liệu. (Ngoài ra, bất cứ ai viết các tài liệu subprocess là một nhà văn tốt hơn tôi.)

+0

Tại sao thêm "shell = True" làm cho nó hoạt động? –

+3

Và với 'shell = True', lệnh này được gửi đến một shell, sau đó tách đối số tách. – mgilson

+0

@MarkIngram - dường như chúng tôi đã nhận xét cùng một lúc. – mgilson

Các vấn đề liên quan