Subprocess.Popen ve os.system arasındaki fark


Yanıtlar:


99

Eğer check out Python docs alt süreç bölümünü , değiştirmek bir örnek buluştuğunu göreceksiniz os.system()ile subprocess.Popen():

sts = os.system("mycmd" + " myarg")

... aynı şeyi yapar ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

"Geliştirilmiş" kod daha karmaşık görünüyor, ancak daha iyi çünkü bir kez öğrendiğinizde subprocess.Popen()başka hiçbir şeye ihtiyacınız yok. subprocess.Popen()diğer os.system()üç Python modülüne dağılmış olan diğer birkaç aracı ( bunlardan sadece biridir) değiştirir.

Yardımı olacaksa, subprocess.Popen()çok esnek olarak düşünün os.system().


sts = p.wait()Son satır yerine de kullanabilirsiniz .
Sven Marnach

1
@JacobMarble, başka bir python betiğinden bir selenyum kazıma betiği çağırdığımı varsayalım, bunlardan hangisi kazıma betiğini tamamlamama ve sonra sadece bir sonraki kod satırını çalıştırmama izin verir? Olduğu gibi, yürütme devam etmeden önce kazıma işlemim tamamlanmalı.
Prakhar Mohan Srivastava

Belki de yapabiliyorsanız kaçınmanız gerektiğini belirtmek için stackoverflow.com/questions/3172470/… ' den bahsedin shell=True. Bu seçeneğe sahip olmak, faydalarından biridir subprocess.Popen()ve yardımcı işlevleridir.
üçlü

@PrakharMohanSrivastava Akışı engellemek ve komutun çalışmasını tamamlamak için beklemek istiyorsanız şu adrese göz
atın

Genel olarak @PrakharMohanSrivastava, hem os.systemve subprocess.call/popen/runbitirmek için komut için blok / bekleme yapar: stackoverflow.com/a/14059648/4752883
alpha_989


23

os.systemUnix systemkomutuna eşdeğerdir subprocess, Popenkomutlar tarafından sağlanan birçok özelliği daha kolay ve kontrol edilebilir bir arayüzle sağlamak için oluşturulmuş yardımcı bir modüldür . Bunlar Unix Popen komutuna benzer şekilde tasarlandı .

system()komutta belirtilen bir komutu çağırarak yürütür /bin/sh -c commandve komut tamamlandıktan sonra geri döner

Buna karşılık:

popen()Fonksiyonu, bir boru oluşturmak bölmek ve kabuk çağırarak bir işlem açar.

Hangisini kullanacağınızı düşünüyorsanız, o zaman subprocesskesinlikle kullanın, çünkü yürütme için tüm olanaklara ve ayrıca süreç üzerinde ek kontrole sahip olursunuz.


tamam .. o zaman hem os.system'i hem de windows env içinde popen'i çalıştırmanın bir yolu var mı? Ben
acemiyim

Evet, Windows Ortamında hem os.system hem de alt süreci kullanabilirsiniz. Effbot.org'dan (Python Standart Kitaplığı çevrimiçi kitabı) temel öğreticilere bir göz atın
Senthil Kumaran

Dikkatli olun - eski sistemlerde çalışıyorsanız, alt işlem modülü kullanılamaz.
Steve Hanov

21

Alt süreç popen2'ye dayalıdır ve bu nedenle birçok avantajı vardır - burada PEP'te tam bir liste var , ancak bazıları:

  • kabukta boru kullanmak
  • daha iyi satırsonu desteği
  • istisnaların daha iyi ele alınması

2

Windows üzerinde python (cpython) çalıştırırken , <built-in function system> os.system perdeler _wsystem altında çalıştırılırken , windows olmayan bir işletim sistemi kullanıyorsanız, sistemi kullanır .

Bunun tersine Popen , windows üzerinde CreateProcess ve posix tabanlı işletim sistemlerinde _posixsubprocess.fork_exec kullanmalıdır.

Bununla birlikte, önemli bir tavsiye os.system belgelerinden geliyor ve şöyle diyor:

Alt süreç modülü, yeni süreçler üretmek ve sonuçlarını almak için daha güçlü olanaklar sağlar; bu modülün kullanılması, bu işlevi kullanmaya tercih edilir. Yararlı bazı tarifler için alt işlem belgelerinde Eski İşlevleri Alt İşlem Modülüyle Değiştirme bölümüne bakın.

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.