Nasıl Python yorumlayıcısı en ve / veya bir Python komut dosyasından cmd.exe'yi çıkışını yakalamak için?

oy
7
  1. o bir Python komut dosyasından komutların ne çıktı çıkış yakalamak mümkün mü?
  2. o bir Python komut dosyası Windows CMD çıkışını yakalamak mümkün mü?

Ben | (ler y) içine bakmak gerekir hangi librar, Eğer öyleyse?

Oluştur 24/08/2008 saat 07:46
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
0

Hangi bağlam soruyorsun?

Eğer komut satırında başlamak bir programdan çıkış yakalamak çalışıyorsunuz?

eğer öyleyse, o zaman bu çalıştırabiliyor için yapılması gerekenler:

somescript.py | your-capture-program-here

ve çıktı okumak için, sadece standart girdiden okunan.

Öte yandan, kendi programı içinden benzer senaryoyu ya cmd.exe'yi veya yürütülmesi ve komut / program bitene kadar bekleyin ve tüm çıkış yakalamak istiyor iseniz, o zaman kütüphaneye bakmak gerekir harici program büyük olasılıkla size çıkışını okuyup tamamlanmasını beklemek için bir yol vermek için sormak için bir yol olduğunu başlatmak için kullandığınız çağırır.

Cevap 24/08/2008 saat 08:05
kaynak kullanıcı

oy
1

Sen istediğiniz alt işlemi . 17.1.1 yılında POPEN de özellikle bak ve 17.1.2 iletişim.

Cevap 24/08/2008 saat 08:27
kaynak kullanıcı

oy
9

Eğer script 'ebeveyn' olduğu piton tercüman ya Cmd.exe'yi bahsediyoruz o zaman hayır, bu mümkün değildir. Her POSIX benzeri sistemde (şimdi öyle görünüyor ki, Windows çalıştırıyorsanız, ve ben YMMV, bilmem bazı cilvesi olabilir) her işlem üç akışının standart girdi, standart çıktı ve standart hata vardır. Bu varsayılan (zaman konsolda çalıştıran) bu konsola yönlendirilir, ancak yönlendirme borusu gösterimi kullanarak mümkündür:

python script_a.py | python script_b.py

Bu hala bu örnekte konsola gider komut B. Standart hata standart girdi akışına komut bir standart çıkış akımını bağlar. Ile ilgili makaleye bakın standart akışları Wikipedia'da.

Bir alt süreç söz ediyorsanız, (İki yönlü iletişim istiyorsanız Stdin de bir seçenektir) şöyle piton onu başlatabilirsiniz:

import subprocess
# Of course you can open things other than python here :)
process = subprocess.Popen(["python", "main.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = process.stderr.readline()
y = process.stdout.readline()
process.wait()

Python'un Bkz altişlem süreci yönetilmesi ile ilgili olarak modül. Iletişim için, process.stdin ve process.stdout boruları standart olarak kabul edilir dosya nesneleri .

Borularla kullanım için, standart girişten okuma olarak lassevk Böyle bir şey yapacağını önerdi:

import sys
x = sys.stderr.readline()
y = sys.stdin.readline()

tanımlanan, yukarıda belirtildiği gibi sys.stdin ve sys.stdout standart dosya nesneleri sys modülü. Ayrıca bir göz atmak isteyebilirsiniz borular modülü.

Benim örnekte olduğu gibi taleb () ile veri okuma olsa verileri almanın oldukça naif bir yoldur. Çıkış hattı odaklı veya muhtemelen içine bakmak istiyorum İndeterminist değilse yoklama maalesef pencerelerde çalışmıyor, ama eminim orada bazı alternatif var.

Cevap 24/08/2008 saat 08:39
kaynak kullanıcı

oy
3

Aslında, kesinlikle can ve aynı zamanda güzel çirkin ve deli!

Sen sys.stdout değiştirip çıktı toplamak StringIO nesnelerle sys.stderr olabilir.

İşte bir örnek, evil.py olarak kaydedin:

import sys
import StringIO

s = StringIO.StringIO()

sys.stdout = s

print "hey, this isn't going to stdout at all!"
print "where is it ?"

sys.stderr.write('It actually went to a StringIO object, I will show you now:\n')
sys.stderr.write(s.getvalue())

Bu programı çalıştırdığınızda, göreceksiniz:

  • hiçbir şey Stdout'a gitti (baskı genellikle için yazdırır yerde)
  • stderr'e yazılı alır ilk dize 'It' ile başlayan biridir
  • sonraki iki satır StringIO nesnede toplandı olanlardır

Böyle sys.stdout / err değiştirilmesi monkeypatching denen bir uygulamadır. Görüşler, bu 'desteklenen' olup olmadığını değişebilir ve kesinlikle çirkin kesmek, ama bir veya iki kez dış şeyler etrafında sarmak için çalışırken benim pastırma kurtardı.

değil Windows üzerinde Linux üzerinde test edilmiştir ancak böylesi daha iyi çalışması gerekir. Windows üzerinde çalışır bana bildirin!

Cevap 26/08/2008 saat 22:16
kaynak kullanıcı

oy
4

Ben Sorunuzun ilk bölümü için iyi bir cevaba işaret edebilir düşünüyorum.

1. Bir Python komut gelen komutların ne çıktı çıkış yakalamak mümkün mü?

Cevabı " evet " ve şahsen de örneklerden kaldırdı aşağıdaki gibi PEP 343 - "ile" Bildirimi belgesi.

from contextlib import contextmanager
import sys

@contextmanager
def stdout_redirected(new_stdout):
    saved_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout.close()
        sys.stdout = saved_stdout

Ve bu gibi kullanılabilir:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

Bunun bir güzel bir yönü, bir komut dosyasının yürütme yerine tüm genişliği sadece bir bölümü etrafında selektif uygulanabilir olması ve işlenmemiş özel durumlar, kendi bağlamında yetiştirilir bile etkin kalır. Eğer ilk kullanımdan sonra ekleme modunda dosyayı yeniden açarsanız, tek bir dosya içine sonuçları birikebilir:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

print "screen only output again"

with stdout_redirected(open("filename.txt", "a")):
    print "Hello world2"

Tabii ki, yukarıda da ayrıca yönlendirmek için uzun olabilir sys.stderraynı veya başka bir dosyaya. Ayrıca, bu bkz cevabı ilgili soruya.

Cevap 31/07/2010 saat 15:40
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more