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,
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,
Câu trả lời:
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ụ: dir
bạ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.
dir.exe
trong khi có /bin/ls
trong * nix. dir
được triển khai bởi CMD.EXE giống như cd
được thực hiện bởi bash .
PATH
từ os.environ
và tìm kiếm nó theo cách thủ công.
Trên Windows, tôi tin rằng subprocess
mô-đun sẽ không xuất hiện PATH
trừ khi bạn vượt quashell=True
vì nó sử dụng CreateProcess()
ở hậu trường. Tuy nhiên, shell=True
có 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 subprocess
tuy 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 PATH
có 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.)
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.
/k
thay vì /c
. Nhập cmd /?
tại dòng lệnh để biết chi tiết.
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/
Để 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
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.