2013-08-04 19 views
8

Bir alt işlem yürüttüğüm bir ana işlem var; Ben dosyalarını kullanarak bunu yapabilirsiniz biliyorum: Gerçek sabit disk dosyaları OLMADAN özel Stdin boru kullanmak için herhangi bir seçenekDosyaları kullanmadan alt işlem boruları stdin

import subprocess 
subprocess.call('shell command', stdin=open('somefile','mode')) 

var mı? Örneğin dize listesi kullanmak için herhangi bir seçenek var mı (her liste öğesi bir satırsonu olacak)?

Python alt işleminin, boru nesnesinde .readline() numaralı telefonu çağırdığını biliyorum.

+1

Sorunuza mutlaka cevap, herhangi bir POSIX uyumlu işletim sistemi bir 'dosyası' olarak/dev/stdin'nin kullanımını destekler belirtmekte yarar var olsa da, bu da çalışır akışı sonlandırmak için bir EOF kullanarak kabuk komutları ile kurulu. Sadece OSX, Linux ve OpenBSD'de tcsh ve bash kullanarak bunu doğruladı. – synthesizerpatel

+0

@synthesizerpatel bir cevap değil, ama değerli bir yorum için teşekkürler! – ducin

+1

Şey .. Adalet içinde, ** bir ** cevaptır. Sadece ** cevap değil. : D – synthesizerpatel

cevap

4

İlk olarak, subprocess.Popen - .call numaralı telefonun sadece bir kısayoludur ve Popen örneğini kullanarak boruya yazabilirsiniz. Ardından subprocess.PIPE bayrağını stdin kwarg olarak geçirin. Bir şey gibi:

import subprocess 
proc = subprocess.Popen('shell command', stdin=subprocess.PIPE) 
proc.stdin.write("my data") 

http://docs.python.org/2/library/subprocess.html#subprocess.PIPE

+0

Ayrıca, stdin dosya tanıtıcısına sayısal değer de vererek, 'stdin = 0' değerini de belirtebilirsiniz. – synthesizerpatel

+0

@synthesizerpatel er, bu ince bir fark, ama bu alt işlemin * ebeveyn * işleminin kullanılması gerektiğini anlatıyor - stdin - sorulmadığı veri, nerede dizilendiyse (örnekte) bir dizeler listesinden oluşturuldu. Bunun dışında genel olarak sayı-sayı tutamaçlarını (/ dev/stdin gibi) genel olarak kabul etmekten vazgeçerim. Bunun nedeni, yanlış işlemin okuyucuyu yaptığı zaman, paylaşılan stdin'in er ya da geç hatalara neden olması ve amaçlanan stdin-işleme süreci için veri akışını karıştırmasıdır. – AdamKG

+0

Yeterince adil, sadece dosya tanıtıcısı kullanımının sayısından bahsedildiğini hissettim. – synthesizerpatel