Windows ไม่พบไฟล์ใน subprocess.call ()


104

ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

รหัสของฉันคือ:

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

Windows 7, 64 บิต Python 3.x ล่าสุดเสถียร

ความคิดใด ๆ ?

ขอบคุณ


และไฟล์ปฏิบัติการนี้คืออะไร?
SilentGhost

ว่า "หุ่นยนต์" เป็นส่วนหนึ่งของปฏิบัติการของ Android SDK
ศรี

2
และเป็นที่มีอยู่บนเส้นทาง
ศรี

คุณสามารถเรียกใช้จากบรรทัดคำสั่งได้หรือไม่
SilentGhost

พื้นหลังเล็กน้อยของสิ่งที่ฉันพยายามทำให้สำเร็จ สิ่งนี้มีไว้สำหรับ Opendevice - โครงการโอเพ่นซอร์สเพื่อแปลงแอป HTML5 เป็นแอปเฉพาะอุปกรณ์ ฉันกำลังพยายามแทนที่ os.system () ในbitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/…เป็น subprocess.call ()
ศรี

คำตอบ:


180

เมื่อคำสั่งเป็นเชลล์ในตัวให้เพิ่ม 'shell = True' ในการโทร

เช่นdirคุณจะพิมพ์:

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

อ้างจากเอกสารประกอบ:

เวลาเดียวที่คุณต้องระบุ shell = True บน Windows คือเมื่อคำสั่งที่คุณต้องการดำเนินการถูกสร้างไว้ในเชลล์ (เช่น dir หรือ copy) คุณไม่จำเป็นต้องใช้ shell = True เพื่อรันไฟล์แบตช์หรือไฟล์ปฏิบัติการบนคอนโซล


14
นั่นเป็นเพราะไม่มีการเรียกใช้งานdir.exeในขณะที่มี/bin/lsin * nix dirจะดำเนินการโดยCMD.EXEชอบมากcdจะดำเนินการโดยการทุบตี
Apalala

1
นี่เป็นกำลังใจอย่างยิ่ง docs.python.org/2/library/…
nu everest

11
@nueverest เฉพาะเมื่อสร้างสตริงคำสั่งจากอินพุตภายนอก
Jirka

อีกทางเลือกหนึ่ง (ปลอดภัยกว่าสำหรับอินพุตภายนอก) คือรับPATHจากos.environและค้นหาด้วยตนเอง
asmeurer

ดูstackoverflow.com/a/32799942/3912576สำหรับวิธีแก้ปัญหาที่เหมาะสมกว่ามากสำหรับปัญหานี้
SimonBiggs

35

ใน Windows ฉันเชื่อว่าsubprocessโมดูลจะไม่ดูในPATHกรณีที่คุณไม่ผ่านshell=Trueเพราะใช้CreateProcess()เบื้องหลัง อย่างไรก็ตามshell=Trueอาจมีความเสี่ยงด้านความปลอดภัยหากคุณส่งผ่านข้อโต้แย้งที่อาจมาจากภายนอกโปรแกรมของคุณ เพื่อให้ยังคงสามารถที่จะหาที่ปฏิบัติการที่ถูกต้องคุณสามารถใช้subprocess shutil.whichสมมติว่าไฟล์ปฏิบัติการในPATHชื่อของคุณfrob:

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

(ใช้ได้กับ Python 3.3 ขึ้นไป)


4
ตัวเลือก python 2 ใด ๆ ?
Naramsim

1
คุณคิดถูกและกำลังแนะนำวิธีแก้ไขที่ถูกต้อง คำตอบนี้ควรได้รับการยอมรับ คำตอบที่ยอมรับในปัจจุบันไม่ได้อธิบายถึงสาเหตุและกำลังแนะนำวิธีแก้ไขซึ่งอาจเป็นอันตรายในบางกรณี
David Ferenczy Rogožan

18

ใน Windows คุณต้องเรียกใช้ cmd.exe ดังที่กล่าวถึง Apalala คำสั่งของ Windows ถูกนำไปใช้ใน cmd.exe ไม่ใช่เป็นไฟล์ปฏิบัติการแยกต่างหาก

เช่น

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

/ c บอกให้ cmd รันคำสั่ง follow

วิธีนี้ปลอดภัยกว่าการใช้ shell = True ซึ่งทำให้สามารถฉีดเชลล์ได้


ฉันจะเปิดหน้าจอได้อย่างไร
Moondra

2
@Moondra, ถ้าผมเข้าใจคุณถูกต้องให้ลองแทน/k /cป้อนcmd /?ที่บรรทัดคำสั่งเพื่อดูรายละเอียด
User5910

@ User5910 ขอบคุณครับ จะลองดูเมื่อมีโอกาส
Moondra

3

หากคุณใช้ powershell ก็จะเป็นsubprocess.call(['powershell','-command','dir'])เช่นนั้น Powershell รองรับคำสั่ง POSIX ส่วนใหญ่


2

หลังจากเกาหัวมากฉันพบว่าการเรียกใช้ไฟล์ที่อยู่ใน C: \ Windows \ System32 \ ในขณะที่เรียกใช้ python เวอร์ชัน 32 บิตบนเครื่อง 64 บิตนั้นเป็นปัญหาที่อาจเกิดขึ้นได้เนื่องจาก Windows พยายามที่จะทำกระบวนการที่ชาญฉลาดและ เปลี่ยนเส้นทางการโทรไปยัง C: \ Windows \ System32 ถึง C: \ Windows \ SysWOW64

ฉันพบตัวอย่างวิธีแก้ไขที่นี่: http://code.activestate.com/recipes/578035-disable-file-system-redirector/


1

อ้างจากเอกสารประกอบ:

"ก่อนหน้า Python 3.5 ฟังก์ชันทั้งสามนี้ประกอบด้วย API ระดับสูงเพื่อประมวลผลย่อยตอนนี้คุณสามารถใช้ run () ได้ในหลาย ๆ กรณี แต่โค้ดที่มีอยู่จำนวนมากจะเรียกใช้ฟังก์ชันเหล่านี้

SO: แทนที่จะใช้ subprocess.call ให้ใช้ subprocess.run สำหรับ Python 3.5 ขึ้นไป


จริงและเป็นประโยชน์
Erick G.Hagstrom

0

ฉันพบปัญหาเดียวกันในขณะที่เรียก PHP สาเหตุคือ PHP ไม่อยู่ใน PATH จึงไม่พบคำสั่ง PHP แต่ PowerShell พบว่ามีอยู่ในตำแหน่งปัจจุบันและแนะนำให้เปลี่ยน 'PHP' ด้วย '. \ PHP' ถ้าฉันเชื่อคำสั่งนี้ จากนั้นจะทำงานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.