Aku punya Python script yang dibutuhkan untuk mengeksekusi program eksternal, tapi untuk beberapa alasan gagal.
Jika saya memiliki script berikut:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Maka itu gagal dengan galat berikut:
'C:\Temp\a' tidak diakui sebagai internal or external command, operable program or batch file.
Jika aku melarikan diri program dengan kutipan:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Kemudian ia bekerja. Namun, jika saya menambahkan parameter, ia berhenti bekerja lagi:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Apa adalah cara yang tepat untuk mengeksekusi suatu program, dan menunggu untuk itu untuk menyelesaikan? Saya tidak perlu untuk membaca output dari itu, karena ini adalah visual program yang melakukan pekerjaan dan kemudian hanya keluar, tapi aku harus menunggu untuk itu untuk menyelesaikan.
Perhatikan juga, memindahkan program ke non-spasi jalan bukanlah pilihan baik.
Ini tidak bekerja baik:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Catatan bertukar single/double quote.
Dengan atau tanpa parameter ke Notepad di sini, gagal dengan pesan error
nama file, nama direktori, atau label volume sintaks yang salah.
subproses.panggilan
akan menghindari masalah dengan harus berurusan dengan mengutip konvensi dari berbagai kerang. Ia menerima daftar, daripada sebuah string, sehingga argumen yang lebih mudah dipisahkan. yaitu
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Berikut ini's cara yang berbeda untuk melakukannya.
Jika anda're menggunakan Windows berikut ini bertindak seperti double-klik file di Explorer, atau memberikan nama file sebagai argumen ke DOS "mulai" perintah: file dibuka dengan aplikasi apa pun (jika ada) ekstensi ini terkait dengan.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Contoh:
import os
os.startfile('textfile.txt')
Ini akan membuka textfile.txt dengan Notepad jika Notepad adalah terkait dengan .file txt.
Terluar kutipan dikonsumsi oleh Python itu sendiri, dan Windows shell doesn't melihat itu. Seperti disebutkan di atas, Windows hanya memahami tanda kutip ganda. Python akan mengkonversi ke depan-disayat dengan garis miring terbalik pada Windows, sehingga anda dapat menggunakan
os.system('"C://Temp/a b c/Notepad.exe"')
The ' ini dikonsumsi oleh Python, yang kemudian melewati "C://Temp/a b c/Notepad.exe" (sebagai jalan Windows, tidak ada dua garis miring terbalik diperlukan) untuk CMD.EXE
Setidaknya di Windows 7 dan Python 3.1, os.sistem
di Windows ingin command line double-quoted jika ada ruang di jalan untuk perintah. Misalnya:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Sebuah contoh dunia nyata yang stumping saya adalah kloning drive di VirtualBox. The subproses.panggilan
solusi di atas tidak't bekerja karena beberapa hak akses masalah, tapi ketika saya double-quoted perintah, os.sistem
menjadi bahagia:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
Misalkan kita ingin menjalankan Django web server (di Linux) yang ada adalah ruang antara jalur (path='/home/<anda>/<pertama-path-bagian> <kedua-path-bagian>'
), sehingga lakukan hal berikut:
import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[Catatan]:
chmod 755 -R <'menunjuk jalan'>
manage.py
ini exceutable: chmod +x manage.py