2011-03-17 27 views
35

Tempfile yazmak ve bir komuta eklemek için yazabileceğim bir şey var mı? Komutu çalıştırmak istiyorum, örneğin: some_command/tmp/some-temp-file.
Çok teşekkürler şimdiden.create & read from from okpile

import tempfile 
temp = tempfile.TemporaryFile() 
temp.write('Some data') 
command=(some_command temp.name) 
temp.close() 

cevap

27

Bir adla geçici bir dosyaya ihtiyacınız varsa, NamedTemporaryFile işlevini kullanmanız gerekir. Sonra temp.name'u kullanabilirsiniz. Detaylar için http://docs.python.org/library/tempfile.html'u okuyun.

+9

Eğer – balki

+1

@balki some_command geçmeden önce dosyayı temizlemek emin olun ya da bunu tamponsuz yapmak için 'tamponboyu = 0' geçebilir. –

1

bir NamedTemporaryFile ve üye name yerine kullanın. TemporaryFile'un düzgün bir şekilde, Unix filesystems çalışma şeklinden dolayı bir isme sahip olduğu garanti edilmez.

13

Python 3.0 kaldırmak bu deneyin edildi:

import tempfile 
import commands 
import os 

commandname = "cat" 

f = tempfile.NamedTemporaryFile(delete=False) 
f.write("oh hello there") 
f.close() # file is not immediately deleted because we 
      # used delete=False 

res = commands.getoutput("%s %s" % (commandname,f.name)) 
print res 
os.unlink(f.name) 

Sadece içeriğini yazdırır geçici dosya, ama bu size doğru fikir vermelidir. Dosya, harici işlem görmeden önce kapalı (f.close()) olduğunu unutmayın. Bu önemli - tüm yazım görevlerinin düzgün bir şekilde yıkanmasını sağlar (ve Windows'da dosyayı kilitlemediğinizi). NamedTemporaryFile örnekleri, kapatıldıkları zaman genellikle silinir; dolayısıyla delete=False bit.

İşlem üzerinde daha fazla denetim istiyorsanız, subprocess.Popen'u deneyebilirsiniz, ancak commands.getoutput sizin amaçlarınız için yeterli olabilir.

+1

Bu yanıt (özellikle 'delete = False' &' close() '), Windows kasası için önemli bilgilerdir. Teşekkür ederim. – meowsqueak

66

Tam örnek.

import tempfile 
with tempfile.NamedTemporaryFile() as temp: 
    temp.write('Some data') 
    if should_call_some_python_function_that_will_read_the_file(): 
     temp.seek(0) 
     some_python_function(temp) 
    elif should_call_external_command(): 
     temp.flush() 
     subprocess.call(["wc", temp.name]) 

Güncelleme: Açıklamalarda belirtildiği gibi bu pencerelerde çalışmayabilir. Pencereler için this çözümü kullanın

+11

Sadece komut bir Python koduyla değiştirilmişse (bir işlev çağrısı gibi) temp.seek (0) yaptığınızdan emin olun, eğer bu işlev içeriği okumayı denediyse boş bırakılmaz. _with_ kullanımı için – Fortepianissimo

+3

+1. [Document] 'daki örneklerin (https://docs.python.org/2/library/tempfile.html) _with_ kullanmadığı bir neden var mı? – cbare

+2

Bunu [docs] 'dan (https://docs.python.org/3.4/library/tempfile.html#tempfile.NamedTemporaryFile) dikkate aldığınızdan emin olun: "Dosyayı ikinci kez açmak için ad kullanılabilir mi, Adlandırılmış geçici dosya hala açıkken, * platformlar arasında * değişiklik gösterir (Unix'te kullanılabilir; Windows NT veya daha sonra kullanılamaz). 'With' ifadesini kullanmak,' command' komutunu çağırdığınızda tempfile özelliğini açık tutar ve kodunuzun taşınabilirliği etkilenir. – Jens