ฉันได้รับข้อผิดพลาดต่อไปนี้:
WindowsError: [Error 2] The system cannot find the file specified
รหัสของฉันคือ:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 บิต Python 3.x ล่าสุดเสถียร
ความคิดใด ๆ ?
ขอบคุณ
ฉันได้รับข้อผิดพลาดต่อไปนี้:
WindowsError: [Error 2] The system cannot find the file specified
รหัสของฉันคือ:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 บิต Python 3.x ล่าสุดเสถียร
ความคิดใด ๆ ?
ขอบคุณ
คำตอบ:
เมื่อคำสั่งเป็นเชลล์ในตัวให้เพิ่ม 'shell = True' ในการโทร
เช่นdir
คุณจะพิมพ์:
import subprocess
subprocess.call('dir', shell=True)
อ้างจากเอกสารประกอบ:
เวลาเดียวที่คุณต้องระบุ shell = True บน Windows คือเมื่อคำสั่งที่คุณต้องการดำเนินการถูกสร้างไว้ในเชลล์ (เช่น dir หรือ copy) คุณไม่จำเป็นต้องใช้ shell = True เพื่อรันไฟล์แบตช์หรือไฟล์ปฏิบัติการบนคอนโซล
dir.exe
ในขณะที่มี/bin/ls
in * nix dir
จะดำเนินการโดยCMD.EXEชอบมากcd
จะดำเนินการโดยการทุบตี
PATH
จากos.environ
และค้นหาด้วยตนเอง
ใน Windows ฉันเชื่อว่าsubprocess
โมดูลจะไม่ดูในPATH
กรณีที่คุณไม่ผ่านshell=True
เพราะใช้CreateProcess()
เบื้องหลัง อย่างไรก็ตามshell=True
อาจมีความเสี่ยงด้านความปลอดภัยหากคุณส่งผ่านข้อโต้แย้งที่อาจมาจากภายนอกโปรแกรมของคุณ เพื่อให้ยังคงสามารถที่จะหาที่ปฏิบัติการที่ถูกต้องคุณสามารถใช้subprocess
shutil.which
สมมติว่าไฟล์ปฏิบัติการในPATH
ชื่อของคุณfrob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(ใช้ได้กับ Python 3.3 ขึ้นไป)
ใน Windows คุณต้องเรียกใช้ cmd.exe ดังที่กล่าวถึง Apalala คำสั่งของ Windows ถูกนำไปใช้ใน cmd.exe ไม่ใช่เป็นไฟล์ปฏิบัติการแยกต่างหาก
เช่น
subprocess.call(['cmd', '/c', 'dir'])
/ c บอกให้ cmd รันคำสั่ง follow
วิธีนี้ปลอดภัยกว่าการใช้ shell = True ซึ่งทำให้สามารถฉีดเชลล์ได้
/k
/c
ป้อนcmd /?
ที่บรรทัดคำสั่งเพื่อดูรายละเอียด
หากคุณใช้ powershell ก็จะเป็นsubprocess.call(['powershell','-command','dir'])
เช่นนั้น Powershell รองรับคำสั่ง POSIX ส่วนใหญ่
หลังจากเกาหัวมากฉันพบว่าการเรียกใช้ไฟล์ที่อยู่ใน C: \ Windows \ System32 \ ในขณะที่เรียกใช้ python เวอร์ชัน 32 บิตบนเครื่อง 64 บิตนั้นเป็นปัญหาที่อาจเกิดขึ้นได้เนื่องจาก Windows พยายามที่จะทำกระบวนการที่ชาญฉลาดและ เปลี่ยนเส้นทางการโทรไปยัง C: \ Windows \ System32 ถึง C: \ Windows \ SysWOW64
ฉันพบตัวอย่างวิธีแก้ไขที่นี่: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
อ้างจากเอกสารประกอบ:
"ก่อนหน้า Python 3.5 ฟังก์ชันทั้งสามนี้ประกอบด้วย API ระดับสูงเพื่อประมวลผลย่อยตอนนี้คุณสามารถใช้ run () ได้ในหลาย ๆ กรณี แต่โค้ดที่มีอยู่จำนวนมากจะเรียกใช้ฟังก์ชันเหล่านี้
SO: แทนที่จะใช้ subprocess.call ให้ใช้ subprocess.run สำหรับ Python 3.5 ขึ้นไป
ฉันพบปัญหาเดียวกันในขณะที่เรียก PHP สาเหตุคือ PHP ไม่อยู่ใน PATH จึงไม่พบคำสั่ง PHP แต่ PowerShell พบว่ามีอยู่ในตำแหน่งปัจจุบันและแนะนำให้เปลี่ยน 'PHP' ด้วย '. \ PHP' ถ้าฉันเชื่อคำสั่งนี้ จากนั้นจะทำงานได้ดี