Saya menghadapi situasi yang tidak menyenangkan dengan instalasi diam-diam dari beberapa program. Saya tidak yakin mereka menggunakan konvensi apa pun untuk tanda instalasi dengan nilai tetapi di sini apa yang harus digunakan untuk instalasi:
"path with spaces\setup.exe" -uninst -s -f2"path with spaces\uninstall.log"
Anda tidak dapat menggunakan --f2="path with spasi\uninstall.log" atau -f2="path with spasi\uninstall.log" atau -f2 "path dengan spasi\uninstall.log"
jadi jika saya menggunakan Python berikut:
command = [self.setup_exe, '-uninst', '-s', fr'-f2"{uninstall_log_file}"']
perintah yang dijalankan subproses (dapatkan dari subprocess.list2cmdline(command)) adalah:
setup.exe" -uninst -s -f2\"some path\temp build 12\uninstall.log\"
pada dasarnya muncul garis miring dan instalasi gagal. Secara teoritis saya dapat membuat string sendiri tetapi penyedia yang sama untuk executable lain menyediakan sintaks lain yang lebih kompatibel dengan subproses. Saya bertanya-tanya apakah mungkin menyiapkan daftar argumen untuk memenuhi persyaratan penginstal?
shell=True
padahal seharusnya tidak. - person chepner   schedule 19.06.2020shell=True
hanya beralih dari menjalankan perintah secara langsung ke menjalankan shell dengan argumen yang dibangun agar shell menjalankan perintah untuk Anda. - person chepner   schedule 19.06.2020command
:fr'-f2"{uinstall_log_file}"'
. Anda dapat menghilangkannya. - person chepner   schedule 19.06.2020uninstall_log_file
, dan apa perintah sebenarnya yang Anda gunakan untuk menjalankan file yang dapat dieksekusi? - person chepner   schedule 20.06.2020command
, seperti yang saya tunjukkan sebelumnya. Anda menambahkan tanda kutip yang dimaksudkan untuk mencegah shell memproses nilaiuninstall_log_file
, namun apakah tidak ada shell seperti itu. Cobacommand = [..., '-f2', uninstall_log_file]
. - person chepner   schedule 22.06.2020