ฉันเผชิญกับสถานการณ์ที่ไม่พึงประสงค์ด้วยการติดตั้งบางโปรแกรมแบบเงียบ ๆ ฉันไม่แน่ใจว่าพวกเขาใช้แบบแผนใด ๆ สำหรับแฟล็กการติดตั้งที่มีค่า แต่นี่คือสิ่งที่ควรใช้สำหรับการติดตั้ง:
"path with spaces\setup.exe" -uninst -s -f2"path with spaces\uninstall.log"
คุณไม่สามารถใช้ --f2="path with spaces\uninstall.log" หรือ -f2="path with spaces\uninstall.log" หรือ -f2 "path with spaces\uninstall.log"
ดังนั้นถ้าฉันใช้ใน Python ต่อไปนี้:
command = [self.setup_exe, '-uninst', '-s', fr'-f2"{uninstall_log_file}"']
คำสั่งที่กระบวนการย่อยกำลังดำเนินการ (รับจาก subprocess.list2cmdline(command)) คือ:
setup.exe" -uninst -s -f2\"some path\temp build 12\uninstall.log\"
โดยทั่วไปจะมีเครื่องหมายทับปรากฏขึ้นและการติดตั้งล้มเหลว ตามทฤษฎีฉันสามารถสร้างสตริงของตัวเองได้ แต่ผู้ให้บริการรายเดียวกันสำหรับไฟล์ปฏิบัติการอื่นนั้นให้ไวยากรณ์อื่นที่เข้ากันได้กับกระบวนการย่อยมากกว่า ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะตั้งค่ารายการอาร์กิวเมนต์เพื่อตอบสนองความต้องการของผู้ติดตั้ง?
shell=True
ในเวลาที่คุณไม่ควรใช้ - person chepner   schedule 19.06.2020shell=True
เพียงสลับจากการรันคำสั่งโดยตรงเป็นการรันเชลล์ด้วยอาร์กิวเมนต์ที่สร้างขึ้น เพื่อให้เชลล์รันคำสั่งแทนคุณ - person chepner   schedule 19.06.2020command
:fr'-f2"{uinstall_log_file}"'
คุณสามารถละเว้นได้ - person chepner   schedule 19.06.2020uninstall_log_file
คืออะไร และคำสั่งจริงที่คุณใช้เพื่อรันไฟล์เรียกทำงานคืออะไร - person chepner   schedule 20.06.2020command
ดังที่ฉันอธิบายไว้ก่อนหน้านี้ คุณกำลังเพิ่มเครื่องหมายคำพูดที่มีจุดประสงค์เพื่อป้องกันไม่ให้เชลล์ประมวลผลค่าuninstall_log_file
แต่ไม่มี คือ ไม่มีเชลล์ดังกล่าว ลองcommand = [..., '-f2', uninstall_log_file]
- person chepner   schedule 22.06.2020