2016-03-29 22 views
1

anda çağrı: kullanarak değişken

f = open('/tmp/list.txt','w') 
f.write(list) 
f.close() # Make sure to close the file before call sub-process. 
      # Otherwise, file content will not visible to sub-process. 

process = subprocess.Popen('oscommand --file={}'.format(f.name), 
          shell=True, stdout=subprocess.PIPE) 

Ancak [ShortId] kullanılarak gerçekleştirilen bir bağımsız değişken olarak bir değişken kullanmak gerekir [1].
u=ShortId() 
process = subprocess.Popen('oscommand --label "The unique id is "'+u' --file={}'.format(f.name), 
           shell=True, stdout=subprocess.PIPE) 

nasıl iyi ele öncelenimin edilir: gibi bir şey gerekiyor? Bu ya id riskini önler

u=ShortId() 
cmd = ['oscommand', '--label', 'The unique id is {}'.format(u), '--file={}'.format(f.name)] 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE) 

: Eğer shell=True ile str komutları yapmaya çalışıyorum bırakıp, sadece shell=False (varsayılan) ile güvenli, daha hızlı list tabanlı komutu kullanırsanız bu aslında daha kolaydır

+0

'.format (str (u))' yi denediniz mi? –

+0

Bir dizeyi 'Popen' komutuna iletiyorsunuz. Dizeyi formatlayıp biçimlendirmeden önce bir değişken olarak kaydedebilirsiniz. – James

cevap

4

veya komutun yanlış bir şekilde ayrıştırılmasına neden olan kabuk meta karakterlerini içeren dosya adı (yani, boşluk) (veya dize aktif olarak kötü amaçlıysa, ör. foo;sudo rm -rf /* adlı bir dosya gibi).

Ayrıca dosya Popen komut tamamlandıktan sonra son gerekiyordu olup olmadığını, geçici dosyaları yapacak daha iyi yolları vardır unutmayın:

import tempfile 

with tempfile.NamedTemporaryFile('w+t', delete=False) as f: 
    f.write(mylist) 
... rest of code here ... 

Alternatif dosya kullanımdan sonra otomatik olarak temizlenmesi gerekir eğer :

with tempfile.NamedTemporaryFile('w+t') as f: 
    f.write(mylist) 
    f.flush() 
    ... rest of code using temp file ... 
+1

Son argüman bile ikiye bölünebilir: '[..., '--file', f.name]'. '--arg = değer 'formu, seçeneği ve argümanını tek bir kabuk kelimesi olarak düşünmenin daha uygun olduğu durumlar için (şu an üzerinde düşünebildiğim) durumlar içindir. – chepner

+0

@chepner: Bu, kullanımda olan ayrıştırma kitaplığı değişkenine bağlı olacaktır, ancak çoğunun buna eşit davranacağını kabul ediyorum. – ShadowRanger

+0

ShadowRanger tarafından yukarıda gösterildiği gibi uygulandığında hata oluştuktan sonra tempfile işlemeye geçilmeye çalışıldı "Sorun okuma dosyası '/ tmp/tmpULLmrW'" – dross

İlgili konular