Saya menggunakan eSpeak di Ubuntu dan memiliki skrip Python 2.7 yang mencetak dan mengucapkan pesan:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak menghasilkan suara yang diinginkan, tetapi mengacaukan shell dengan beberapa kesalahan (ALSA lib ..., tidak ada soket terhubung) sehingga saya tidak dapat dengan mudah membaca apa yang dicetak sebelumnya. Kode keluar adalah 0.
Sayangnya tidak ada opsi yang terdokumentasi untuk mematikan verbositasnya, jadi saya mencari cara untuk hanya membungkamnya secara visual dan menjaga shell terbuka bersih untuk interaksi lebih lanjut.
Bagaimana saya bisa melakukan ini?
python
python-2.7
subprocess
espeak
rypel
sumber
sumber
os.system
sintaks. Padahal itu hanya untuk ilustrasi. Tetap dengan subprosessubprocess.DEVNUL
solusi sempurna .Jawaban:
Redirect output ke DEVNULL:
Secara efektif sama dengan menjalankan perintah shell ini:
sumber
os.devnull
jikasubprocess.DEVNULL
tidak tersedia (<3.3), gunakancheck_call()
alih-alihcall()
jika Anda tidak memeriksa kode yang dikembalikan, buka file dalam mode biner untukstdin/stdout/stderr
, penggunaanos.system()
harus tidak disarankan,&>
tidak berfungsi untuksh
pada Ubuntu dan eksplisit>/dev/null 2>&1
bisa digunakan.os.devnull
tetapi tidak sengaja mengetiknya. Juga, saya tetap menggunakan OPcall
karena mereka tidak menangkap kemungkinan pengecualiancheck_call
akan meningkat. Dan untukos.system
pengalihan, itu lebih merupakan ilustrasi tentang apa yang dilakukan dengan efektif penggunaan pendekatan subproses. Bukan sebagai saran kedua.close_fds=True
disubprocess.call
untuk menutupFNULL
deskriptor setelah sub proses yang adaclose_fds=True
, deskriptor file ditutup setelahfork()
tetapi sebelumexecvp()
mis., mereka ditutup dalam proses anak sebelum dieksekusi dijalankan.close_fds=True
tidak akan berfungsi di Windows jika ada aliran dialihkan .close_fds
tidak menutup file dalam proses induk .Ini versi yang lebih portabel (hanya untuk bersenang-senang, tidak perlu dalam kasus Anda):
sumber
DEVNULL
yang tidak sepenuhnya umum, seperti yang disediakan olehsubprocess
; sejak dibukawb
itu tidak dapat digunakan untukstdin
.'r+b'
mode jika Anda membutuhkannya.Gunakan
subprocess.check_output
(baru dalam python 2.7). Ini akan menekan stdout dan memunculkan eksepsi jika perintah gagal. (Ini sebenarnya mengembalikan konten stdout, sehingga Anda dapat menggunakannya nanti di program Anda jika Anda mau.) Contoh:Anda juga dapat menekan stderr dengan:
Untuk lebih awal dari 2,7, gunakan
Di sini, Anda dapat menekan stderr dengan
sumber
except subprocess.CalledProcessError as e
dan kemudian gunakane.code
ataue.output
Pada Python3 Anda tidak perlu lagi membuka devnull dan dapat memanggil subprocess.DEVNULL .
Kode Anda akan diperbarui seperti itu:
sumber
stderr
denganstdout
kode di atas (atau menambahkan argumen lain) untuk menekan output. "Keluaran" ada dalam judul pertanyaan dan apa yang menuntun saya ke sini ... mungkin sepele, tetapi berpikir itu layak disebut.Mengapa tidak menggunakan command.getoutput () saja?
sumber
text
memiliki tanda kutip di dalamnya, atau menggunakan pengkodean karakter yang berbeda, atau terlalu besar untuk baris perintah c) itu hanya Unix (pada Python 2)