Windows không thể tìm thấy tệp trên subprocess.call ()


103

Tôi nhận được lỗi sau:

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?

Cảm ơn,


và tập tin thực thi này là gì?
SilentGhost

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

2
Và được có sẵn trên PATH
Sri

bạn có thể chạy nó từ dòng lệnh không?
SilentGhost

Một chút thông tin cơ bản về những gì tôi đang cố gắng hoàn thành. Điều này dành cho Opendevice - một dự án mã nguồn mở để chuyển đổi các ứng dụng HTML5 thành các ứng dụng dành riêng cho thiết bị. Tôi đang cố gắng để thay thế os.system () trong bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/... để subprocess.call ()
Sri

Câu trả lời:


178

Khi lệnh là một shell được tích hợp sẵn, hãy thêm 'shell = True' vào lệnh gọi.

Ví dụ: dirbạn sẽ nhập:

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

Để trích dẫn từ tài liệu:

Lần duy nhất bạn cần chỉ định shell = True trên Windows là khi lệnh bạn muốn thực thi được tích hợp sẵn trong shell (ví dụ: dir hoặc copy). Bạn không cần shell = True để chạy một tệp hàng loạt hoặc tệp thực thi dựa trên bảng điều khiển.


14
Đó là bởi vì không có tệp thực thi nào được gọi dir.exetrong khi có /bin/lstrong * nix. dirđược triển khai bởi CMD.EXE giống như cdđược thực hiện bởi bash .
Apalala

1
Điều này rất không được khuyến khích. docs.python.org/2/library/…
nu everest

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

Giải pháp thay thế (an toàn hơn cho đầu vào bên ngoài) là lấy PATHtừ os.environvà tìm kiếm nó theo cách thủ công.
asmeurer

Xem stackoverflow.com/a/32799942/3912576 để có giải pháp phù hợp hơn cho vấn đề này.
SimonBiggs

33

Trên Windows, tôi tin rằng subprocessmô-đun sẽ không xuất hiện PATHtrừ khi bạn vượt quashell=True vì nó sử dụng CreateProcess()ở hậu trường. Tuy nhiên, shell=Truecó thể là một rủi ro bảo mật nếu bạn chuyển các đối số có thể đến từ bên ngoài chương trình của bạn. Để thực hiện subprocesstuy nhiên có thể tìm thấy tập tin thực thi chính xác, bạn có thể sử dụng shutil.which. Giả sử tệp thực thi trong của bạn PATHcó tên frob:

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

(Điều này hoạt động trên Python 3.3 trở lên.)


4
Bất kỳ tùy chọn python 2?
Naramsim 19/03/18

1
Bạn nói đúng và bạn đang đề xuất cách phù hợp để sửa chữa nó. Câu trả lời này nên được chấp nhận. Câu trả lời được chấp nhận hiện tại không giải thích nguyên nhân và đang đề xuất một cách khắc phục có thể gây nguy hiểm trong một số trường hợp.
David Ferenczy Rogožan

18

Trên Windows, bạn phải gọi thông 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 thực thi riêng biệt.

ví dụ

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

/ c yêu cầu cmd chạy lệnh follow

Điều này an toàn hơn so với việc sử dụng shell = True, cho phép tiêm shell.


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

2
@Moondra, Nếu tôi hiểu bạn đúng, hãy thử /kthay vì /c. Nhập cmd /?tại dòng lệnh để biết chi tiết.
Người dùng5910

@ Người dùng5910 Cảm ơn bạn. Sẽ thử khi tôi có cơ hội.
Moondra,

3

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


2

Sau nhiều lần vò đầu bứt tai, tôi phát hiện ra rằng việc chạy một tệp nằm trong C: \ Windows \ System32 \ trong khi chạy phiên bản python 32 bit trên máy 64 bit là một vấn đề tiềm ẩn, do Windows đang cố gắng vượt qua quy trình và chuyển hướng cuộc gọi đến C: \ Windows \ System32 đến C: \ Windows \ SysWOW64.

Tôi đã tìm thấy một ví dụ về cách khắc phục sự cố này tại đây: http://code.activestate.com/recipes/578035-disable-file-system-redirector/


1

Để trích dẫn từ tài liệu:

"Trước Python 3.5, ba hàm này bao gồm API cấp cao để xử lý con. Bây giờ bạn có thể sử dụng run () trong nhiều trường hợp, nhưng rất nhiều mã hiện tại gọi các hàm này."

VẬY: thay vì subprocess.call hãy sử dụng subprocess.run cho Python 3.5 trở lên


Đúng và hữu ích.
Erick G. Hagstrom

0

Tôi đã gặp vấn đề tương tự khi đang gọi PHP. Lý do là PHP không có trong PATH nên không tìm thấy lệnh PHP. Nhưng PowerShell nhận thấy nó tồn tại ở vị trí hiện tại và nó đề xuất thay thế 'PHP' bằng '. \ PHP' nếu tôi tin tưởng lệnh này. Sau đó, nó chạy tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.