2010-06-11 32 views
66

Tôi nhận được lỗi sau:Windows không thể tìm thấy file trên subprocess.call()

WindowsError: [Error 2] The system cannot find the file specified 

Mã của tôi là:

subprocess.call(["<<executable file found in PATH>>"]) 

Windows 7, 64 bit. Python 3.x mới nhất, ổn định.

Bất kỳ ý tưởng nào?

Xin cảm ơn,

+0

và tệp thực thi này là gì? – SilentGhost

+0

Phần thực thi "android" của Android SDK – Sri

+1

Và là * có sẵn trên PATH – Sri

Trả lời

120

Tôi không chắc chắn tại sao nhưng, trên máy tính cửa sổ của tôi, tôi phải thêm 'shell = True' vào cuộc gọi.

Ví dụ: cho dir bạn nên gõ:

import subprocess 
subprocess.call('dir', shell=True) 

Hope this helps,

Douglas

Để trích dẫn từ tài liệu: Thời gian duy nhất bạn cần phải xác định vỏ = True trên Windows là khi lệnh bạn muốn thực hiện được xây dựng vào vỏ (ví dụ như dir hoặc sao chép). Bạn không cần shell = True để chạy một tập tin thực thi hoặc thực thi dựa trên giao diện điều khiển.

+13

Đó là bởi vì không có thực thi được gọi là 'dir.exe' trong khi có một '/ bin/ls' trong * nix. 'dir' được thực hiện bởi _CMD.EXE_ giống như' cd' được thực hiện bởi _bash_. – Apalala

+0

Điều này không được khuyến khích. https://docs.python.org/2/library/subprocess.html#frequently-used-arguments –

+5

@nueverest Chỉ khi chuỗi lệnh _ được xây dựng từ đầu vào bên ngoài_ – Jirka

3

Nếu đường dẫn có dấu cách, nó được trích dẫn không?

Và tất nhiên, bạn đã thoát dấu gạch chéo ngược đúng cách hoặc sử dụng dấu gạch chéo, phải không?

+0

Có nó được trích dẫn đúng cách. Lệnh tương tự cũng hoạt động khi được gọi thông qua phương thức os.system(). – Sri

9

Trên Windows, tôi tin rằng mô-đun subprocess không hiển thị trong PATH trừ khi bạn vượt qua shell=True. Tuy nhiên, shell=True có thể là một nguy cơ bảo mật nếu bạn đang chuyển các đối số có thể đến từ bên ngoài chương trình của bạn. Tuy nhiên, để làm cho subprocess có thể tìm được tệp thực thi chính xác, bạn có thể sử dụng shutil.which. Giả sử thực thi trong PATH của bạn được đặt tên frob:

subprocess.call([shutil.which('frob'), arg1, arg2]) 

(. Này hoạt động trên Python 3.3 trở lên)

6

Trên Windows bạn phải gọi qua cmd.exe. Như Apalala đã đề cập, các lệnh Windows được thực hiện trong cmd.exe không phải là các tệp thi hành riêng biệt.

ví dụ:

subprocess.call(['cmd', '/c', 'dir']) 

/c nói cmd để chạy các lệnh sau

Đây là an toàn hơn so với sử dụng vỏ = True, cho phép tiêm vỏ.

+0

Rất hữu ích. Cảm ơn bạn. – Moondra

+0

Làm cách nào để giữ màn hình mở? – Moondra

0

Nếu bạn đang sử dụng PowerShell, thì trong đó sẽ là subprocess.call(['powershell','-command','dir']). Powershell hỗ trợ một phần lớn lệnh POSIX

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