Alt işlem popen Python nasıl kullanılır


103

Os.popen'in yerini subprocess.popen aldığından, nasıl dönüştüreceğimi merak ediyordum

os.popen('swfdump /tmp/filename.swf/ -d')

subprocess.popen () için

Denedim:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

Ama sanırım bunu doğru düzgün yazmıyorum. Herhangi bir yardım memnuniyetle karşılanacaktır. Teşekkürler


1
Bu bir Windows Makinesi mi yoksa Linux makinesi mi?
AAI

Yanıtlar:


142

subprocess.Popen bir argüman listesi alır:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

Bir bile var belgelerin bölüm kullanıcıların göçünü yardımcı olmaya adamış os.popeniçin subprocess.


18
@HansThen shell=Trueedilir değil önerilir.
Pierre GM

7
@Lukas Graf Kodda öyle söylediğinden beri. @Alex shell = True, güvenilmeyen verileri işlemek için kullanıldığında bir güvenlik riski olarak kabul edilir. Akıllı bir saldırgan, keyfi sistem komutlarına erişmek için girdiyi değiştirebilir. Örneğin filename.swf; rm -rf /dosya adının değerini girerek . Bununla birlikte, bu yalnızca Popen'e yönelik argümanınızın içeriği güvensiz olduğunda bir sorundur.
Hans Sonra

10
@Lukas Graf Kod parçasından, güvenilmeyen kullanıcı tarafından sağlanan verilerle doldurulmasının örnek bir değer olarak kastedildiğinden kesinlikle şüpheliyim. Ama o maddeyle ilgili ateşkes ilan etmeye hazırım. Demekshell=True istediğim, güvenilmeyen girişler dışında kullanmamak için bir neden olmadığıdır . Bunun shell=Truetavsiye edilmediğini basitçe söylemek yanıltıcıdır.
Hans Sonra

7
@HansThen: PS Beni yanlış anlamayın, burada davanıza bakmaya çalışmıyorum. Sadece bununla ilgili risklerin farkında gibi görünüyorsunuz shell=True, ancak bu soruya rastlayan herhangi bir rastgele kullanıcı olmayabilir. Bu yüzden shell=True, ne yaptığınızı tam olarak bilmiyorsanız, aslında tavsiye edilmediğini vurgulamanın önemli olduğunu düşünüyorum .
Lukas Graf

4
@Blender Kimse bunun zararlı olduğunu söylemedi - bu sadece tehlikeli. Ancak bunun dışında, argümanınız hiç mantıklı değil. Python standart kitaplığının ortaya çıkardığı birçok işletim sistemi işlevi potansiyel olarak tehlikelidir - shutil.rmtreeörneğin alın. Ancak bunun stdlib'e dahil edilip edilmediğiyle ilgisi yok. UNIX'in "Unix, kullanıcılarının aptalca şeyler yapmasını engellemek için tasarlanmadığını, çünkü bu onların akıllıca şeyler yapmasını da engelleyeceğini" düşünüyorum. büyük kısımlarda Python için de geçerlidir.
Lukas Graf

9

Sh kullanın , işleri çok daha kolay hale getirir:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

2
sh, bu iyi, ancak alt işlemdeki Popen ile aynı değil. sh, alt işlemin çağrısı ile aynıdır.
liuyang1

-1

Alt Süreci en kolay şekilde kullanmak !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.