Saya memiliki skrip Python yang perlu menjalankan program eksternal, tetapi karena beberapa alasan gagal.
Jika saya memiliki skrip berikut:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Kemudian gagal dengan kesalahan berikut:
'C: \ Temp \ a' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan, atau file batch.
Jika saya keluar dari program dengan kutipan:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Lalu berhasil. Namun, jika saya menambahkan parameter, itu berhenti berfungsi lagi:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Apa cara yang tepat untuk menjalankan program dan menunggu sampai selesai? Saya tidak perlu membaca output dari itu, karena ini adalah program visual yang melakukan pekerjaan dan kemudian hanya keluar, tetapi saya harus menunggu sampai selesai.
Perhatikan juga, memindahkan program ke jalur non-spasi juga bukan pilihan.
Ini juga tidak bekerja:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Perhatikan tanda kutip tunggal / ganda bertukar.
Dengan atau tanpa parameter ke Notepad di sini, gagal dengan pesan kesalahan
Nama file, nama direktori, atau sintaks label volume tidak benar.
sumber
os.system(r'C:\temp\"a b c"\Notepad.exe')
atau ini:os.system('C:\\temp\\"a b c"\\Notepad.exe')
"C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif"
. Dalam Python, menjadi:["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Jawaban:
subprocess.call
akan menghindari masalah dengan harus berurusan dengan mengutip konvensi dari berbagai kerang. Ia menerima daftar, bukan string, sehingga argumen lebih mudah dibatasi. yaitusumber
subprocess.call
harus diganti olehsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiInilah cara berbeda untuk melakukannya.
Jika Anda menggunakan Windows, tindakan berikut seperti mengeklik dua kali file di Explorer, atau memberikan nama file sebagai argumen untuk perintah "mulai" DOS: file dibuka dengan aplikasi apa pun (jika ada) ekstensi yang terkait dengan .
Contoh:
Ini akan membuka textfile.txt dengan Notepad jika Notepad dikaitkan dengan file .txt.
sumber
webbrowser.open("textfile.txt")
itu harus membuka editor teks. Lihat juga "memulai program kedua sepenuhnya sendiri, seolah-olah saya hanya 'mengklik dua kali'."os.startfile('path\to\textfile.txt')
Kutipan terluar dikonsumsi oleh Python sendiri, dan shell Windows tidak melihatnya. Seperti disebutkan di atas, Windows hanya memahami tanda kutip ganda. Python akan mengonversi garis depan-garis miring ke garis miring terbalik pada Windows, sehingga Anda dapat menggunakannya
The 'dikonsumsi oleh Python, yang kemudian meneruskan "C: //Temp/abc/Notepad.exe" (sebagai jalur Windows, tidak diperlukan backslash ganda) ke CMD.EXE
sumber
os.system('curl URL > file')
mana saya ingin melihat refresh meteran kemajuan CURL untuk file yang sangat besar.\t
,\n
, dll) maka backslash tertentu harus dua kali lipat. Menjadi jalur Windows tidak ada hubungannya dengan itu.os.system()
Windows, jendela cmd akan terbuka dan tetap terbuka sampai Anda menutup proses yang dimulai. IMHO lebih baik digunakanos.startfile()
.import os
Setidaknya di Windows 7 dan Python 3.1,
os.system
di Windows ingin baris perintah dikutip ganda jika ada spasi di jalur ke perintah. Sebagai contoh:Contoh dunia nyata yang membuat saya bingung adalah kloning drive di VirtualBox. The
subprocess.call
solusi di atas tidak bekerja karena beberapa akses rights issue, tetapi ketika saya dikutip ganda perintah,os.system
menjadi bahagia:sumber
subprocess
, tapi kadangos.system
- kadang danos.popen(...).read()
hanya mengetik lebih cepat. BTW, Anda tidak perlu melarikan diri dari tanda kutip ganda di dalam tunggal, yaitu'""C:\\Temp\\a b c\\Notepad.exe""'
akan dilakukan.sumber
Untuk python> = 3.5
subprocess.run
harus digunakan sebagai penggantisubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
sumber
Saya menduga itu masalah yang sama seperti ketika Anda menggunakan pintasan di Windows ... Coba ini:
sumber
Misalkan kita ingin menjalankan server web Django Anda (di Linux) bahwa ada ruang di antara jalur Anda (path =
'/home/<you>/<first-path-section> <second-path-section>'
), jadi lakukan hal berikut:[ Catatan ]:
chmod 755 -R <'yor path'>
manage.py
dapat dijelaskan:chmod +x manage.py
sumber
Untuk Python 3.7, gunakan subprocess.call . Gunakan string mentah untuk menyederhanakan jalur Windows:
sumber
Tidak perlu untuk sub-proses, Ini hanya dapat dicapai dengan
GitPath = "C: \ Program Files \ Git \ git-bash.exe" # Path File Aplikasi dalam mycase GITBASH-nya os.startfile (GitPath)
sumber