2011-01-31 12 views
52
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) 

şu anda ben bir betik ile. Çalıştırdığımda ve bu çizgiye isabet ettiğinde, baskıya başlıyor çünkü run.sh'in içinde baskı var.Bir altprogram çağrısını bir metin dosyasına nasıl dağıtırım?

Nasıl da bir metin dosyasına bu pipomu mı?

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput) 

O zaman ( myoutput ile istediğinizi yapabilirsiniz ... popen için

cevap

93

Eğer subprocess.call ait stdout -argument kullanabileceğiniz bir dosyaya çıktı yazmak istiyorsanız.

O None, subprocess.PIPE bir dosya nesneyi veya bir dosya tanıtıcı alır. İlk öntanımlıdır, stdout üst öğeden (komut dosyanız) alınır. İkincisi, bir komuttan/işlemden diğerine aktarmanızı sağlar. Üçüncü ve dördüncü, istediğiniz bir şeydir, çıktıların bir dosyaya yazılması. Bir soket (gasp gibi, herhangi bir geçerli bir dosya benzeri nesne çalışacak tahmin ediyorum

f = open("blah.txt", "w") 
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) 

:

Sen call nesne veya dosya tanımlayıcısı tamsayı open gibi bir şey ile bir dosyayı açmak ve geçmesi gerekiyor :)), ama hiç denemedim.

marcog, stderr'i yeniden yönlendirmek istediğiniz yorumlarda da belirtildiği gibi, bunu stderr=subprocess.STDOUT ile stdout ile aynı konuma yönlendirebilirsiniz. Yukarıda belirtilen değerlerden herhangi biri de çalışır, farklı yerlere yönlendirebilirsiniz.

+1

Evet, soketin işi de. – ocodo

+1

neden subprocess.call (["echo", "1", ">>", "t.txt"]) çalışmıyor? – Goldname

+2

@Goldname yönlendirme yapmak için bir kabuk gerekiyor, bu nedenle: 'subprocess.call ([" echo "," 1 "," >> "," t.txt "], shell = True)' çalışmalıdır. –

16

seçenekleri Yani call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0 

kullanılabilir (mümkünse Ve ayrıca, baskı) hangi btw bir dosya olması gerekir).

Ayrıca, böyle bir borulu çıkışına yakın bir şeyler yapabiliriz.

dmesg | grep hda 

olacaktır:

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

python manual page üzerinde güzel, yararlı bilgiler yer var.

İlgili konular